как передать переменную сессии в модель в RoR? - PullRequest
5 голосов
/ 10 июня 2010

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

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

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

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

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

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

Ответы [ 4 ]

6 голосов
/ 10 июня 2010

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

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

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

2 голосов
/ 10 июня 2010

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

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

@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] непосредственно в своем представлении, но лучше вместо этого установить его в переменной экземпляра.

1 голос
/ 10 июня 2010

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

1 голос
/ 10 июня 2010

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

Например,

class User < ActiveRecord::Base

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

end

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

User.some_method(session[:user_id])
...