如何从params或session中分配值,以哪个存在?

时间:2010-05-13 15:18:56

标签: ruby-on-rails ruby

执行以下操作的“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-kochjdeseno):

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

如果我将最终条件(|| {})从该行代码中删除,那么当{[cust_options]和会话[:cust_options]都没有定义时,我的initialize方法会发生什么,或者两者都是是nil

我的initialize定义如下:

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

3 个答案:

答案 0 :(得分:5)

写一个更短的方法是

@options = CustomOptions.new(params[:cust_options] || session[:cust_options])
祝你好运。

答案 1 :(得分:1)

您可以使用'或'运算符来默认:

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

答案 2 :(得分:1)

您可以尝试将这些代码放在您拥有的控制器中。执行此操作将使会话密钥可用于控制器中的所有操作。还可以保证在调用任何控制器的操作之前,已设置会话值。

# 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