因此,在我的视图顶部,我创建了一个小表格,该表格可让用户选择一个学期和一个字段:
<%= 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
,并且页面将显示错误。
我想不出解决方案,也不确定在哪里看。我读到我不应该为参数设置默认值?甚至有可能吗?
与进入已经预定义参数的视图相比,有其他解决方法吗?我相信我在这里可能做的是根本上错误的事情,但是今天我才了解了形式和参数。
预先感谢:)
答案 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。