如何从零开始处理参数? (NoMethodError)

时间:2018-08-20 20:31:03

标签: html ruby-on-rails ruby forms filter

因此,在我的视图顶部,我创建了一个小表格,该表格可让用户选择一个学期和一个字段:

<%= form_tag '', :method => :get do %>
          <%= collection_select(:semester, :semester_id, Semester.all, :id, :name, prompt: true) %>
          <%= collection_select(:field, :field_id, Field.all, :id, :name, prompt: true) %>
          <%= submit_tag 'Filter' %>
          <% end %>

,然后页面将基于此“过滤器”生成,以显示具有不同链接的主题。现在,为此,我在控制器中使用以下声明:

@betterFilteredLinks = Link.where("semester_id = #{params[:semester][:semester_id].to_i} AND field_id = #{params[:semester][:semester_id].to_i}")

如果我使用如下所示的过滤器加载页面,那一切都可以正常工作

http://0.0.0.0:3000/?utf8=✓&semester%5Bsemester_id%5D=2&field%5Bfield_id%5D=1&commit=Filter

但是,如果我仅加载http://0.0.0.0:3000/,它将(自然)将过滤器的参数设置为nil,并且页面将显示错误。

我想不出解决方案,也不确定在哪里看。我读到我不应该为参数设置默认值?甚至有可能吗?

与进入已经预定义参数的视图相比,有其他解决方法吗?我相信我在这里可能做的是根本上错误的事情,但是今天我才了解了形式和参数。

预先感谢:)

1 个答案:

答案 0 :(得分:1)

我不太清楚您的问题,但是如果您需要为nil或不正确的参数提供默认行为(您也应该验证),则可以在控制器中使用私有方法,从中创建对象参数信息,并使用before_action在操作中设置此对象...类似这样:

private
def set_full_params_data
  @full_params = {}
  params[:semester].nil? ?  @full_params[:semester_id] = DEFAULT_ID : 
                            @full_params[:semester_id] = params[:semester]
                            [:semester_id]
  ... etc
end

并添加

before_action :set_full_params_data, only: [:action_name]

,然后在操作中使用@full_params代替params。