我正在尝试在一个类中创建一个按钮,将用户发送到一个表单以创建另一个类。这是最简单的 has_many/belong_to 关系,但我很困惑。
两个类:事件和影响。事件有_许多影响。
创建从 Events::Show 到 Impacts::New 的链接很简单:
<%= link_to "Add impact", new_impact_path(event_id: @event.id) %>
生成:
<a href="/impacts/new?event_id=5">Add impact</a>
这会向影响控制器发送一个请求,并使用 params[:event_id] = 5 调用 new() 方法
但是我无法理解如何使用 button_to 来做到这一点
方法#1 在 不改变任何路线的情况下,我认为这是正确的。它使用 params[:event_id] 调用 Impacts::New。
<%= button_to "New -loses ID", options = {:controller => "impacts", :action => "new", :event_id => @event.id }, html_options={:method => "get" } %>
生成
<form action="/impacts/new?event_id=5" class="button_to" method="get"><div><input type="submit" value="New -loses ID"></div></form>
routes.rb 显示:
new_impact GET /impacts/new(.:format) impacts#new
但是,当 Impacts::New 执行时,没有传递任何参数。它调用了正确的方法,但参数以某种方式被删除(我不知道为什么/在哪里)。
方法 #2 当我更改我的 routes.rb 时:
resources :events do
resources :impacts
end
routes.rb 现在显示:
new_event_impact GET /events/:event_id/impacts/new(.:format) impacts#new
生成的代码完全不同,但它可以工作。
<form action="/events/5/impacts/new" class="button_to" method="get"><div><input type="submit" value="New -loses ID"></div></form>
所以我的问题:
为什么方法 #1 会丢失参数?
为什么方法 #2 有效?
我怀疑答案是我不懂路线:)
谢谢