我的Rails应用程序发生了一些奇怪的事情。当我尝试向我的一个控制器发送更新命令时,由于某种原因,提交按钮似乎正在改变一些参数。
我正在使用嵌套资源并设置有参与者的比赛。很简单。但是,出于某种原因,当我尝试更新参与者时,它会将:race_id的值更改为参与者的ID(:id)。
虽然只在更新时才这样做。我似乎能够使用完全相同的表单完美地创建新参与者,因此提交按钮非常相似。
以下是一些相关代码:
_form.rb(由new和update使用)
<%= form_for ([:race, @participant]) do |f| %>
<%= f.error_messages %>
<p>
<%= f.label :name %><br />
<%= f.text_field :name %>
</p>
<p><%= f.submit %></p>
<% end %>
participants_controller.rb
class ParticipantsController < ApplicationController
before_filter :authenticate_user!, :only => [:edit, :update, :destroy, :create, :new]
before_filter :set_up_race
...
def create
@participant = @race.participants.new(params[:participant])
if @participant.save
redirect_to setup_race_path(@race), :notice => "Successfully created participant."
else
render :action => 'new'
end
end
...
def update
@participant = Participant.find(params[:id])
if @participant.update_attributes(params[:participant])
redirect_to setup_race_path(@race), :notice => "Successfully updated participant."
else
render :action => 'edit'
end
end
...
def set_up_race
@race = Race.find(params[:race_id])
end
end
以下是为什么看起来参数正在改变:
如果我修改_form.rb文件以包含<%= params[:race_id] %>
屏幕告诉我3
当我点击提交时,我得到:
无法找到ID = 25
的Race请求
参数:
{“utf8”=&gt;“✓”,“_ method”=&gt;“put”, “authenticity_token”=&gt; “中4VCZP9sI / iv8n454I8AE76n5vLiwGayuXc1NrPYfzGc =”, “participant”=&gt; {“name”=&gt;“hgdjhgf”},“commit”=&gt;“更新参与者”, “race_id”=&gt;“25”,“id”=&gt;“25”}
(正如您在参数下看到的那样,“race_id”=&gt;“25”在我点击提交后,但该页面最初有:race_id =&gt;“3”(以上证实,如果我做任何事情,请再次表格崩溃))。
所以问题是,在所有这些之后,为什么:race_id在视图和控制器之间的某处发生变化?
编辑:根据Jeff的要求,这是一个rake路由输出: http://dylancodes.net/personal/ARTk/images/routes.png
答案 0 :(得分:1)
您的表单发布到的网址是什么样的?根据您的路线,我希望它看起来像/races/3/participants/25
。从我读过的那一行
form_for ([:race, @participant]) do |f|
创建namespaced route(在该页面上搜索“命名空间”),看起来像/races/participants/25
。
将此行更改为适合您的工作吗?
form_for [@race, @particpant] do |f|
这应该将表单网址构建为/races/:race_id/participants/:id
。