как передать переменную сеанса для моделирования в RoR?

Я использовал глобальную переменную в своем приложении для передающей информации прежде. Но я получил проблему и благодарю всех, здесь предложил, чтобы я хранил те данные на сессии с базой данных.

Я попробовал, но я нашел, что не могу получить доступ к переменной сеанса в Модели. Я погуглил и знал, что это - нормальное поведение Модели, RoR не передаст переменную сеанса для Моделирования.

Так, я хотел бы использовать ту переменную сеанса в проверке и также контроллере....

  1. как передать значение переменной сеанса в Модели? или

  2. есть ли какой-либо другой метод для моего варианта использования? Мне нужна переменная, хранящая значение, которое требуется во всем MVCs и должно быть независимым между различными параллельными пользователями.

Спасибо все.:)

5
задан Victor Lam 10 June 2010 в 05:11
поделиться

4 ответа

Если я вас правильно понял, переменная сеанса изменяет способ проверки модели. Я считаю, что правильным решением для этого является следующее:

class Blog < ActiveRecord::Base
  attr_accessor :validate_title

  validate_presence_of :title, :if => :validate_title
end

class BlogsController < ApplicationController
  def new
    @blog = Blog.new
    @blog.validate_title = session[:validate_title]
  end
end

Код не тестировался, но идея такова. Аргумент if может быть именем метода, и вы можете делать там все, что захотите. Если хотите, у вас могут быть различные режимы проверки. Например:

class Blog < ActiveRecord::Base
  attr_accessor :validation_mode

  validate_presence_of :title, :if => :validate_title

  def validate_title
    validation_mode == "full" or validation_mode == "only_title"
  end
end

class BlogsController < ApplicationController
  def new
    @blog = Blog.new
    @blog.validate_mode = session[:validate_mode]
  end
end

Для получения дополнительной информации прочтите руководство по валидации .

6
ответ дан 13 December 2019 в 22:02
поделиться

Вам нужна переменная сеанса как часть вашей модели или просто как флаг для определения того, что выполнять?

В первом случае вам не нужно знать, откуда произошли параметры, просто передайте переменную в качестве аргумента для некоторого вызова в вашем методе. Например:

@user = User.new (params [: user] .merge (: some_attribute => session [: some_key])

и просто добавьте проверку, как обычно, в модель.

Если вы это необходимо для управления некоторым потоком выполнения, поскольку вы упомянули, что это должно быть разным для разных пользователей, вам может потребоваться переменная экземпляра в вашем контроллере. Примерно

class SomeController
  before_filter :set_some_session_variable

  def set_some_session_variable
    @some_variable = session[:some_key]
  end
end

Вы можете использовать session [: some_key] прямо в вашем представлении, но лучше вместо этого установить его в переменной экземпляра.

2
ответ дан 13 December 2019 в 22:02
поделиться

Лучший способ сделать это - создать метод с аргументом и передать сеанс в качестве аргумента .

Из примера

class User < ActiveRecord::Base

  def self.some_method(some_arg)
     User.find(some_arg)
  end

end

из контроллера

User.some_method(session[:user_id])
1
ответ дан 13 December 2019 в 22:02
поделиться

Модели - это интерфейс к базе данных. Их можно использовать без сеанса (например, из IRB). Разрешить моделям взаимодействовать с сеансом было бы нарушением MVC. Можете ли вы расширить свой вопрос, добавив немного дополнительной информации о том, что вы пытаетесь сделать? Скорее всего, есть лучший способ сделать это.

1
ответ дан 13 December 2019 в 22:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: