【问题标题】:Rails 3 View/Controller: Submit or Update changing parameters passed? ("New" works)Rails 3 View/Controller:提交或更新更改参数传递? (“新”作品)
【发布时间】:2012-03-29 22:05:13
【问题描述】:

我的 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 文件以包含 &lt;%= params[:race_id] %&gt; 屏幕告诉我3

当我点击提交时,我得到:

找不到 id=25 的 Race

请求

参数:

{"utf8"=>"✓", "_method"=>"put", "authenticity_token"=>"4VCZP9sI/iv8n454I8AE76n5vLiwGayuXc1NrPYfzGc=", "participant"=>{"name"=>"hgdjhgf"}, "commit"=>"更新参与者", "race_id"=>"25", "id"=>"25"}

(正如您在参数下看到的那样,“race_id”=>“25”在我单击提交后,但页面最初有 :race_id =>“3”(上面证明了,如果我做任何事情来制作表单崩溃))。

所以问题是,毕竟,为什么 :race_id 在视图和控制器之间发生变化?

编辑:根据 Jeff 的要求,这是一个 rake 路由输出: http://dylancodes.net/personal/ARTk/images/routes.png

【问题讨论】:

  • 我可以通过不执行“set_up_race”进行更新(并使用 :only 让所有其他功能发生)并添加 '@race = Race.find(@participant .race_id)' 正在更新中,但这不是一个好的解决方案。另外它没有解释为什么 :race_id 正在改变......
  • 你的路线是什么样的?你能包括rake routes的输出吗?
  • 是的,我会发布它。但我的意思是,页面似乎都加载正确,这只是视图中的参数与控制器中的参数之间的差异(好像提交按钮的编辑:race_id)。这是路线输出:dylancodes.net/personal/ARTk/images/routes.png

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


【解决方案1】:

您的表单发布到的网址是什么样的?根据您的路线,我希望它看起来像/races/3/participants/25。从我读到的,这行

form_for ([:race, @participant]) do |f|

创建一个类似于/races/participants/25 的namespaced route(在该页面上搜索“命名空间”)。

把那条线改成这条线对你有用吗?

form_for [@race, @particpant] do |f|

这应该将表单 url 构建为/races/:race_id/participants/:id。

【讨论】:

  • 哇。老实说,我以为我把它改成那个是有原因的(冒号真的没有意义:),但看起来它实际上只是一个错字。谢谢,成功了。
猜你喜欢
  • 2013-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-15
相关资源
最近更新 更多