执行以下操作的“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] || {} )
如果我将最终条件(|| {}
)从该行代码中删除,那么当{[cust_options]和会话[:cust_options]都没有定义时,我的initialize
方法会发生什么,或者两者都是是nil
?
我的initialize
定义如下:
def initialize( options = {} )
# stuff happens ...
end
答案 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