Как назначить значение из params или session, в зависимости от того, что существует? - PullRequest
0 голосов
/ 13 мая 2010

Что такое «Rails-way» или «Ruby-way» для выполнения следующих действий:

В моем контроллере я создаю и экземпляр класса Options. Он будет инициализирован информацией в хэше params, если хэш params существует. В противном случае, он проверит хэш сессий для информации. Наконец, он инициализируется значениями по умолчанию, если ни params, ни session не имеют данных, которые ему нужны. Вот как я это делаю сейчас (работает нормально, но немного уродливо):

if params[:cust_options]
  @options = CustomOptions.new( params[:cust_options] )
else
  if session[:cust_options
    @options = CustomOptions.new( session[:cust_options] )
  else
    @options = CustomOptions.new
  end
end

session[:cust_options] = @options.to_hash

Как я уже сказал, все работает нормально, я просто ищу более идиоматически Ruby способ написания этого блока кода.


Обновление

Вот так теперь выглядит мой код (спасибо henning-koch и jdeseno ):

@options = CustomOptions.new( params[:cust_options] || session[:cust_options] || {} )

Если я оставлю окончательное условие (|| {}) за пределами этой строки кода, что произойдет в моем методе initialize, когда не определены ни params [: cust_options], ни session [: cust_options] или оба nil

Мое initialize определение выглядит так:

def initialize( options = {} )
  # stuff happens ...
end

Ответы [ 3 ]

5 голосов
/ 13 мая 2010

Более короткий способ написать это будет

@options = CustomOptions.new(params[:cust_options] || session[:cust_options])

Удачи.

1 голос
/ 13 мая 2010

Вы можете попытаться поместить эти коды в контроллер, который у вас есть. Это сделает сеансовый ключ доступным для всех действий в контроллере. Также гарантируется, что перед вызовом какого-либо действия контроллера было установлено значение сеанса.

# Place this under the controller class definition
before_filter :set_session_value

private

def set_session_value
  session[:cust_options] = find_cust_options_value
end

def find_cust_options_value
  return CustomOptions.new(params[:cust_options])  if params[:cust_options]
  return CustomOptions.new(session[:cust_options]) if session[:cust_options]
  return CustomOptions.new
end
1 голос
/ 13 мая 2010

Вы можете использовать оператор 'или' по умолчанию:

@options = CustomOptions.new( session[:cust_options] || params[:cust_options] || {} )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...