已审核: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'... 仅有时会出错?

Nokogiri:遇到错误“nil:NilClass 的未定义方法‘文本’”