Rails 3 View / Controller:提交或更新传递的更改参数? (“新”作品)

时间:2012-03-29 22:05:13

标签: ruby-on-rails ruby-on-rails-3

我的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

1 个答案:

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