使用form_for丢失第一个id的嵌套资源

时间:2013-03-04 14:05:28

标签: ruby-on-rails-3 form-for nested-routes

这是一个奇怪的错误,确实让我受到了骚扰。首先,一些背景知识。

我在config / routes.rb中有以下嵌套资源:

scope :requirements => { :protocol => 'https' } do
    resource :user
    resources :orgs do
        resources :members
        resources :events
        resources :levels
        resources :attendances
    end
    resources :sessions,    :only => [:new, :create, :destroy]
end

然后,在app / controllers / levels_controller.rb中我有:

def edit
    @org = Org.find(params[:org_id])
    @level = OrgLevel.find(params[:id])
end

def update
    @level = OrgLevel.find(params[:id])
    if @level.update_attributes(params[:level])
        flash[:success] = "Level details updated"
        redirect_to @level
    else
        render 'edit'
    end
end

最后,在app / views / levels / edit.html.erb中,我有:

<% provide(:title, "Edit #{@level.name} for #{@org.name}") %> 
<div class="hero-unit">
    <h2>Edit &quot;<%= @level.name %>&quot; membership level for <%= @org.name %></h2>
    <div class="row">
        <div class="span6 offset3">
            <%= form_for [@org, @level], :url => org_level_path do |f| %>
                <%= render 'shared/error_messages' %>
                <table class="editor">
                    <tr>
                        <td class="label_x">
                            <%= f.label :name %>
                        </td>
                        <td colspan="3">
                            <%= f.text_field :name %>
                        </td>
                    </tr>
                </table>
            <% end %>
        </div>
    </div>
</div>

调用https://spot-macbook.local/orgs/55/levels/162/edit的结果是正常的,但点击“保存更改”会导致重定向到https://spot-macbook.local/orgs/162/levels/162并出现以下错误:

ActiveRecord::RecordNotFound in LevelsController#show

Couldn't find Org with id=162
Rails.root: /Users/ogod/Projects/rails_projects/nom_de_joye_app

Application Trace | Framework Trace | Full Trace
app/controllers/levels_controller.rb:71:in `correct_user'
Request

Parameters:

{"requirements"=>{"protocol"=>"https"},
 "org_id"=>"162",
 "id"=>"162"}

请注意,org_id已更改为“162”而不是“55”。我做错了什么?

1 个答案:

答案 0 :(得分:1)

卫生署!

发布此问题五秒后,我意识到错误并纠正了它。

原始版本具有以下更新方法:

    redirect_to @level

这应该是:

    redirect_to org_level_path(@org, @level)

这么简单的错误,但我看错了地方!

相关问题