0

在我的“帐户”模型的“显示”页面上,我有一个“清单”模型。我希望能够在帐户的显示页面中检查清单上的每个布尔值。我收到以下错误:

NoMethodError in Accounts#show
undefined method `model_name' for NilClass:Class
  • 应用程序/模型/account.rb

    class Account < ActiveRecord::Base
      has_one :checklist
    end
    
  • 应用程序/模型/checklist.rb

    class Checklist < ActiveRecord::Base
      belongs_to :account
      belongs_to :user
    
      validates :account_id, :presence => true
      validates :user_id, :presence => true
    end
    
  • 应用程序/模型/user.rb

    class User < ActiveRecord::Base
      has_many :checklists
    end
    
  • 应用程序/控制器/account_controller.rb

    class AccountController < ApplicationController
      def show
        @account = Account.find(params[:id])
        @checklist = @account.checklist
      end
    end
    
  • app/views/account/show.html.erb

    <% simple_form_for(@checklist) do |checklist| %>
      <div>
        <%= checklist.user.email %>
        <div class="pull-right">
          <%= checklist.created_at.strftime("%b. %d %Y") %>
        </div></br>
        <ul>
          <li><%= checklist.contract_signed %></li>
          <li><%= checklist.contract_details %></li>
          <li>…&lt;/li>
        </ul>
        <%= f.submit "Update", class: 'btn' %>
      </div>
    <% end %>
    
  • 应用程序/控制器/checklists_controller.rb

    class ChecklistsController < ApplicationController
      before_filter :authenticate_user!
    
      def create
        @account = Account.find(params[:account_id])
        @checklist = @account.checklist.build(params[:checklist])
        @checklist.user = current_user
    
        respond_to do |format|
          if @checklist.save
            format.html { redirect_to(@account, :notice => 'Checklist Saved.') }
          else
            format.html { redirect_to(@account, :notice => 'There was an errors') }
          end
        end
      end
    
    
      def destroy
        @checklist = current_user.checklists.find(params[:id])
        @account = Account.find(params[:account_id])
        @checklist.destroy
    
        respond_to do |format|
          format.html { redirect_to @account }
        end
      end
    end
    
4

1 回答 1

2

我不确定我是否完全理解您的视图逻辑,但我认为您需要做的是在进入控制器的创建部分之前构建清单。

例如

  def show
    @account = Account.find(params[:id])
    @checklist = @account.build_checklist
  end

这将允许您调用正在显示的视图中的属性。

您还可以将 create 方法调整为,使用 new 而不是 build

def create
  @account = Account.find(params[:account_id])
  @checklist = @account.checklist.new(params[:checklist])
  @checklist.user = current_user

  respond_to do |format|
      if @checklist.save
        format.html { redirect_to(@account, :notice => 'Checklist Saved.') }
      else
        format.html { redirect_to(@account, :notice => 'There was an error saving your comment (empty comment or comment way to long).') }
      end
  end
end

希望这可以帮助 :)

于 2013-05-17T12:10:55.940 回答