使用text_field的默认值时,从表单参数中避免Nil错误?

时间:2012-10-03 20:41:21

标签: ruby-on-rails

Rails 2.3.5

如果我在下面使用默认会话值或(有优先级)表单参数,有没有办法编写下面的代码以避免出现错误?

<%= f.text_field :deliver_to_addr, :size => 100, :maxlength => 100, :value => params[:request][:delivery_to_address] || session[:address]  %>

我通过在控制器中放置一个逻辑块以找出应该选择的内容(下面)来解决这个问题,但有一种简单的方法可以解决这个问题所以我不需要每次我需要使用默认值(在这种情况下为session [:address])时的代码块?

    if !params[:request].blank?
      if !params[:request][:delivery_to_address].blank?
        @delivery_addr_to_select = params[:request][:delivery_to_address]
      else
        @delivery_addr_to_select = session[:address]
      end
    else
      @delivery_addr_to_select = session[:address]
    end

<%= f.text_field :deliver_to_addr, :size => 100, :maxlength => 100, :value => @delivery_addr_to_select %>

谢谢!

2 个答案:

答案 0 :(得分:3)

您可以使用try中的构建方法:

@delivery_addr_to_select = params[:request].try(:[], :delivery_to_address) || session[:address]

如果结果为[],则会尝试使用:delivery_to_address调用nil哈希方法session[:address]

答案 1 :(得分:0)

您可以尝试使用gem andand来缩短逻辑

@delivery_addr_to_select = params[:request].andand[:delivery_to_address] || session[:address]

无论:request是否存在,此方法都有效,因为如果andand不为零,:delivery_to_address只会调用params[:request]