2013-08-28 63 views
1

所以我有一個Entry模型與一列名爲created_by,我想默認爲第一User誰創造的條目。我安裝了審計,並在我的Entry模型我有:審覈:未定義方法`關聯'爲零:NilClass

belongs_to :user 
audited :associated_with => :user 
在我 User模型

同樣地,我有如下語句:

has_many :entries  
has_associated_audits 

在我的條目形式,我試圖創建其中hidden_field我試圖將created_by設置爲與條目上第一次審覈的關聯用戶相同。在我設定的entries_controller

.field 
    = f.label :created_by 
%br 
    = f.hidden_field :created_by, value: @entry.audits.first.associated 

這裏是代碼:但是我得到這個錯誤,當我嘗試加載表格視圖:

undefined method `associated' for nil:NilClass 

這裏在視圖代碼@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事件創建 新的審計,S因爲它還沒有被保存。我在控制器的create方法中調用@entry.save之後應該設置值@entry.created_by嗎?不確定採取什麼最實用的方法。

謝謝,

Micha'el。

+0

@Damien我認爲@ entry.audits總是爲零,如果@entry = Entry.new並且尚未保存。這讓我想知道在創建'@ entry'的時候如何設置'created_by'字段的最佳位置,我想我可以用'if @ entry.audits'封裝'hidden_​​field'的東西,在這種情況下我可以,假設條目已經被創建,設置'created_by'的值爲我想要的。 – Thalatta

+0

@Damien雖然看起來有點不習慣。 – Thalatta

+1

我同意你不應該在'@ entry.save'之前在表單中設置'created_by'屬性,在控制器中設置它。沒有必要保存條目來獲取用戶,您應該通過'current_user'知道用戶是誰。您可以添加回調驗證以確保是這種情況。 –

回答

2

我會做的是從表單中刪除created_by隱藏字段(即容易被攔截),而是從控制器內設置entry使用current_user(或選擇)保存之前訪問用戶創建的條目。

def create_entry 
    @entry.created_by = current_user 
    @entry.save 
end 

我不會考慮審計已通過@entry.audits.first.associated保存後,因爲這些審計應被關聯到同一current_user,重要的是分配created_by用戶。如果情況並非如此,那麼你的問題就更大了。

相關問題