【发布时间】: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知道用户是谁。您可以添加回调验证以确保是这种情况。
标签: ruby-on-rails forms acts-as-audited