在我的“帐户”模型的“显示”页面上,我有一个“清单”模型。我希望能够在帐户的显示页面中检查核对清单上的每个布尔值的开/关。 我收到以下错误:
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
答案 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
希望这会有所帮助:)