我有一个页面,其中包含一个带有一个选择列表和一个按钮的表单。
<%= form_tag("/restaurant", method: "get") do %>
<%= collection_select(:company_name, nil, Food.distinct_company_names, :company_name, :company_name) %>
<%= submit_tag("Search One", :name => nil, :class=>"btn btn-search") %>
<% end %>
这可以很好地将参数传递到我的餐馆页面,但我不希望URL显示如下 -
http://localhost:3000/restaurant?utf8=%E2%9C%93&company_name%5B%5D=McDonalds
我希望它显示如下(我的路线设置为允许它) -
http://localhost:3000/restaurant/McDonalds
这是我在控制器中的当前解决方案......
def restaurant
if params[:company_name]
@company_name = params[:company_name][0]
redirect_to("/restaurant/"+@company_name)
else
#avoid redirect loop
@company_name ||= params[:id]
end
端
我认为有一种更容易或更优雅的方式来做到这一点。有人能指出我正确的方向吗?
答案 0 :(得分:1)
当select更改值时,您可以使用javascript更改URL。不需要表格。
<%= collection_select :company, :name, Food.distinct_company_names, :company_name, :company_name %>
<script>
$('#company_name').on('change', function() {
if ($(this).val().length) {
window.location = '/restaurant/' + $(this).val()
}
})
</script>
答案 1 :(得分:0)
您可以使用POST方法提交表单,而不是GET方法。在这里你必须使用餐厅控制器,行动名称是麦当劳
<%= form_tag("/restaurant/mcdonalds", method: "post") do %>
<%= collection_select(:company_name, nil, Food.distinct_company_names, :company_name, :company_name) %>
<%= submit_tag("Search One", :name => nil, :class=>"btn btn-search") %>
在routes.rb中
post '/restaurant/mcdonalds'