Rails - 更改控制器显示的URL

时间:2014-08-08 13:01:06

标签: html ruby-on-rails

我有一个页面,其中包含一个带有一个选择列表和一个按钮的表单。

<%= 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  

我认为有一种更容易或更优雅的方式来做到这一点。有人能指出我正确的方向吗?

2 个答案:

答案 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'