具有深层嵌套模型的NoMethodError

时间:2011-07-29 01:21:30

标签: ruby-on-rails

我不确定我是否正确地构建了我的应用程序(我现在已经学习了Rails 2个月)但是我正在构建一个非常深度嵌套的应用程序,如下所示:

用户has_many帐户>帐户has_many字符>字符has_many项目

所以它的深度是4级(至少是计划)。

我目前处于角色状态,而且我在创建表单时遇到了问题:undefined method 'characters' for nil:NilClassscreenshot)。

这是github上的项目:https://github.com/imjp/d2shed

characters_controller.rb

 class CharactersController < ApplicationController 
   def create
     @user = User.find(params[:user_id])
     @account = Account.find(params[:account_id])
     @character = @account.characters.create(params[:character])
     redirect_to root_url
   end
 end



character.rb

class Character < ActiveRecord::Base
  attr_accessible :name, :type  
  belongs_to :account
end



_form.html.erb

<%= form_for([@account, @account.characters.build]) do |f| %>
  <div class="field">
  <%= f.label :name %><br />
  <%= f.text_field :name %>
</div>
<div class="field">
<%= f.radio_button(:type, "SC") %>
    <%= f.label(:type, "SC") %>

    <%= f.radio_button(:type, "HC") %>
    <%= f.label(:type, "HC") %>

    <%= f.radio_button(:type, "SCL") %>
    <%= f.label(:type, "SCL") %>

    <%= f.radio_button(:type, "HCL") %>
    <%= f.label(:type, "HCL") %>
</div> 
<div class="actions">
<%= f.submit %>
</div>
<% end %>

1 个答案:

答案 0 :(得分:2)

您收到此错误的原因是您未在show action中的用户控制器中定义@account,

class UsersController < ApplicationController 
...
  def show
    @user = User.find(params[:id])
    @account = @user.accounts.first # Otherwise @account == nil
    ...
  end
...
end

此外,表单中的路线看起来不正确。

Character资源的create动作在路径中是这样的:

POST /:user_id/accounts/:account_id/characters

所以你需要提供:,user_id,:account_id和character

像这样:

<%= form_for [@user, @account, @account.characters.build] %>