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
    
  • app/controllers/account_controller.rb

    class AccountController < ApplicationController
      def show
        @account = Account.find(params[:id])
        @checklist = @account.checklist
      end
    end
    
  • アプリ/ビュー/アカウント/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 %>
    
  • app/controllers/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

これにより、表示しているビューで属性を呼び出すことができます。

build の代わりに new を使用して、create メソッドを調整することもできます

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 に答える