已审核:nil:NilClass 的未定义方法“关联”
Posted
技术标签:
【中文标题】已审核:nil:NilClass 的未定义方法“关联”【英文标题】:Audited: undefined method `associated' for nil:NilClass 【发布时间】:2013-09-01 01:44:07 【问题描述】:所以我有一个Entry
模型,其中有一个名为created_by
的列,我想将其默认为创建条目的第一个User
。我安装了审核并在我的Entry
模型中:
belongs_to :user
audited :associated_with => :user
同样在我的User
模型中,我有以下陈述:
has_many :entries
has_associated_audits
在我的条目表单中,我试图创建一个hidden_field
,我试图在其中将created_by
设置为等于条目中第一个审核的关联用户。但是,当我尝试加载表单视图时出现此错误:
undefined method `associated' for nil:NilClass
这是视图中的代码:
.field
= f.label :created_by
%br
= f.hidden_field :created_by, value: @entry.audits.first.associated
这是entries_controller
中的代码,我在视图中设置了@entry
:
def new
@entry = Entry.new
authorize! :create, @entry
@project = Project.find(params[:project_id])
@entry.project_id = @project.id
authorize! :update, :read, @project
end
我意识到,直觉上,在创建事件时调用 @entry.audits 没有多大意义
一个新的审计,因为它还没有被保存。我应该在控制器的create
方法中调用@entry.save
之后设置@entry.created_by
的值吗?不太确定在这里采取什么最实用的方法。
谢谢,
迈克尔。
【问题讨论】:
@Damien 我认为如果@entry = Entry.new 并且尚未保存,@entry.audits 总是为零。这让我想知道如果不是在创建@entry
的那一刻设置created_by
字段的最佳位置我想我可以用if @entry.audits
包装hidden_field
的东西,在这种情况下我可以,假设条目有已经创建,将 created_by
值设置为我想要的值。
@Damien 虽然这看起来有点不靠谱。
我同意您不应该在表单中设置created_by
属性,而是在控制器中设置它,在@entry.save
之前。获取用户无需保存条目,您应该通过current_user
知道用户是谁。您可以添加回调验证以确保是这种情况。
【参考方案1】:
我要做的是从表单中删除 created_by
隐藏字段(这很容易被拦截),而是在使用 current_user
(或替代方法)保存 entry
之前从控制器内设置以访问创建条目的用户。
def create_entry
@entry.created_by = current_user
@entry.save
end
我认为在通过@entry.audits.first.associated
保存审核后分配created_by
用户并不重要,因为这些审核应该与同一个current_user
相关联。如果不是这样,你手上的问题就更大了。
【讨论】:
以上是关于已审核:nil:NilClass 的未定义方法“关联”的主要内容,如果未能解决你的问题,请参考以下文章
nil:NilClass 的未定义方法“original_filename”
Cocoa Pods 的问题:nil:NilClass 的未定义方法“map”
nil:NilClass 的未定义方法 `upload' 你的意思是?加载
nil:NilClass 的未定义方法“每个”,但我使用了实例变量
CalendarPosts#index 中的 NoMethodError 用于 nil:NilClass 的未定义方法 'title'... 仅有时会出错?