使用属于的复选框并具有一个关系

时间:2013-05-17 04:59:37

标签: ruby-on-rails forms checkbox associations

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

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
    
  • 应用程序/视图/帐户/ 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>…</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
    

1 个答案:

答案 0 :(得分:2)

我不确定我是否完全理解您的视图逻辑,但我认为您需要做的是在到达控制器的create部分之前构建核对表。

e.g。

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

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

您还可以使用new而不是build

将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

希望这会有所帮助:)