Я использовал глобальную переменную в своем приложении для передающей информации прежде. Но я получил проблему и благодарю всех, здесь предложил, чтобы я хранил те данные на сессии с базой данных.
Я попробовал, но я нашел, что не могу получить доступ к переменной сеанса в Модели. Я погуглил и знал, что это - нормальное поведение Модели, RoR не передаст переменную сеанса для Моделирования.
Так, я хотел бы использовать ту переменную сеанса в проверке и также контроллере....
как передать значение переменной сеанса в Модели? или
есть ли какой-либо другой метод для моего варианта использования? Мне нужна переменная, хранящая значение, которое требуется во всем MVCs и должно быть независимым между различными параллельными пользователями.
Спасибо все.:)
Если я вас правильно понял, переменная сеанса изменяет способ проверки модели. Я считаю, что правильным решением для этого является следующее:
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
Для получения дополнительной информации прочтите руководство по валидации .
Вам нужна переменная сеанса как часть вашей модели или просто как флаг для определения того, что выполнять?
В первом случае вам не нужно знать, откуда произошли параметры, просто передайте переменную в качестве аргумента для некоторого вызова в вашем методе. Например:
@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]
прямо в вашем представлении, но лучше вместо этого установить его в переменной экземпляра.
Лучший способ сделать это - создать метод с аргументом и передать сеанс в качестве аргумента
.
Из примера
class User < ActiveRecord::Base
def self.some_method(some_arg)
User.find(some_arg)
end
end
из контроллера
User.some_method(session[:user_id])
Модели - это интерфейс к базе данных. Их можно использовать без сеанса (например, из IRB). Разрешить моделям взаимодействовать с сеансом было бы нарушением MVC. Можете ли вы расширить свой вопрос, добавив немного дополнительной информации о том, что вы пытаетесь сделать? Скорее всего, есть лучший способ сделать это.