rails link_to method = post with param

时间:2013-11-24 03:03:01

标签: ruby-on-rails post activerecord

我有一个显示动物列表的表格,让我选择多个动物并用它们做点什么。在同一形式中,我需要为列表中的每个动物提供一个链接,该链接将发布到另一个控制器,并发布该动物的id。因此,我需要一个链接在我的另一个表单(没有表单嵌套)内,这个链接将发布到另一个URL。这是我需要发布的路线:

animal_medicalrecords POST   /medicalrecords/animal(.:format)    medicalrecords#animal

这是动物控制器中的表单,以及我现在无法正常工作的link_to:

<%= form_tag(action: "takeaction") do %>
...some irrelevant form stuff ...
<% @animals.each do |animal|  %>
    <%= link_to "Add", animal_medicalrecords_path(:animal_id => animal.id), :method=> :post %>

当我点击链接时,它会带我到这里../medicalrecords/animal?id=1并具有以下参数:{“id”=&gt;“animal”} 所以,我收到的错误是:找不到带有id = animal

的医疗记录

我在做错的是将“动物”作为id与实际ID(在这种情况下为1)发布?

更新: 显然无论我如何更改link_to,它都会继续尝试去控制器中的“show”而不是动物方法。

更新: 如果我在表单中嵌套表单,它可以正常工作......但不是列出的第一个表单:

<%= form_tag("/medicalrecords/animal") do %>
<%= hidden_field_tag(:animal_id,  animal.id) %>
<%= submit_tag("Add") %>
<% end %>

但是,我不能允许表单中的表单。所以,我必须将其转换为带帖子方法的链接。

我包含的link_to示例使用正确的值发布了正确的参数,但是它将其发布到medicalrecords#show而不是medicalrecords#animal。

任何人都知道我需要做些什么来解决这个问题?

1 个答案:

答案 0 :(得分:0)

你可以把这样的东西放在你的routes.rb

resources :medicalrecords do
  post 'animal', on: :collection
end

另一种方法是,如果你想在控制器中有更多方法:

resources :medicalrecords do
  collection do
    post 'animal'
  end
  member do
    get 'method' # will create route: GET '/medicalrecords/:id/method'
  end
end

这会将/医疗记录/动物传递给医疗记录控制器中的方法动物