通过form_tag和select_tag发送URL参数

时间:2015-07-26 03:35:59

标签: ruby-on-rails

我使用嵌套资源,为了制作新的Round,您需要拥有Case的ID,因此我的routes.rb包含以下内容:

resources :cases do
  resources :rounds
end

因此,当用户点击“新一轮”时,在主页上的按钮,它首先将它们引导到一个页面,在这个页面中,他们可以选择一个圆形所属的案例,然后重定向到圆形表格。

对于pick_case视图,我有以下内容:

<%= form_tag new_case_round_path, method: :get do |f| %>

  <%= f.select_tag :case_id,
    options_for_select(Case.all.collect { |c| [c.title, c.id] }),
    class: "chosen-select" %><br/>

  <%= f.submit_tag "Create round", class: "btn btn-primary" %>
<% end %>

但是,rails强迫我在new_case_round_path中命名一个case_id,所以在加载pick_case视图之前它给了我这个错误:

No route matches {:action=>"new", :controller=>"rounds"} missing required keys: [:case_id]

如何在表格中输入路线所需的信息时,如何引用表格需要提交的路线?

2 个答案:

答案 0 :(得分:0)

  

没有路由匹配{:action =&gt;“new”,:controller =&gt;“rounds”}缺失   必需的密钥:[:case_id]

错误清楚地表明case_id缺失。 Rails期望case_id出现,因为您正在创建 新案例实例 ,因此无法在您的情况下提供。

解决问题的一种方法是使用Shallow Nesting 新案例提供 路径

resources :cases do
  resources :rounds, shallow :true
end

现在,当您运行rake routes时,您将找到新案例的路线,如下所示

new_case GET   /cases/new(.:format)  cases#new

因此,在pick_case视图中,您可以将form更改为

<%= form_tag new_case_path, method: :get do |f| %>

  <%= f.select_tag :case_id,
    options_for_select(Case.all.collect { |c| [c.title, c.id] }),
    class: "chosen-select" %><br/>

  <%= f.submit_tag "Create round", class: "btn btn-primary" %>
<% end %>

在重定向到 圆形 之前先创建 案例

答案 1 :(得分:0)

对于答案有点解决方法,我觉得可能有更优雅的方式。我将post 'get_case' => rounds#get_case添加到routes.rb

我把它添加到我的回合控制器中:

def get_case
  id = params[:case_id]
  if id
    redirect_to new_case_round_path(case_id: id)
  else
    flash[:danger] = "An error occured. Please try again"
    redirect_to pick_case_path
  end
end

这是我的新pick_case视图:

<%= form_tag get_case_path do %>

  <%= select_tag :case_id,
    options_for_select(map_with_id(Case, :title)),
    class: "chosen-select" %><br/>

  <%= submit_tag "Create round", class: "btn btn-primary" %>
<% end %>