2011-02-18 75 views
0

嘿,大家我有一個場景,我真的想弄明白。我正在嘗試在Rails中構建一個自定義博客,要求用戶登錄才能發表評論。基本上我有3個模型 - 發佈,用戶和評論。我的問題主要是評論模型。 我想讓它有一個評論belongs_to一個用戶,也belongs_to郵政,這有很多意見。我也讓post_id和user_id無法訪問,因爲我不希望它們被篡改(我希望評論能夠自動與其留下的帖子的ID相關聯,並且我希望用戶能夠自動確定通過會話)。我的問題是我不確定如何創建有效的評論。如果我嘗試添加@ blog.comments.build(@attr)的評論,我忽略了無法訪問的用戶,當然如果我嘗試通過用戶來構建它,我會忽略博客。有兩個外鍵的Rails Activerecord模型,既不可訪問,也不可訪問

我的猜測是有一個更好的方法來做到這一點,我可能會錯誤地接近它。有任何想法嗎?

+0

by @blog你的意思是@post? – jakeonrails 2011-02-18 20:29:08

回答

1

我相信你有這個在Comment模型:

attr_accessible :content 

,當你嘗試建立一個評論出現這種情況:

@post = Post.first 
@post.comments.build(:user=>current_user) 
# => WARNING: Can't mass-assign protected attributes: user 

所以這是行不通的。

如果你想保護的更新被覆蓋的USER_ID和POST_ID,你可以這樣做:

attr_accessible :content, :user_id, :post_id 
attr_readonly :user_id, :post_id 

@post = Post.first 
@post.comments.build(:user=>current_user) 
@post.save! 
# sets user_id when creating 
@post.user_id = 37 
@post.save! 
# saves, but user_id is not changed. No warning is logged. 
@post.update_attributes(:user_id=>37) 
# same as above 
@post.update_attribute(:user_id,37) 
# raises ActiveRecord::ActiveRecordError: user_id is marked as readonly 

但這似乎有點小題大做,因爲可能你的應用程序將不會提交表單與USER_ID對於現有的評論,某人需要編寫自己的表單並將其發佈以更改ID。

1

你總是可以隻手動設置的關係:

comment = @post.build(@attr) 
comment.user = @user 
comment.save 

至少,我敢肯定,將工作。

+0

我試過這個,但得到了一個未定義的方法異常。我也期待這一點,因爲在模型中我只有'attr_accessible:content'而不是user_id或類似的東西。由於用戶必須登錄才能發表評論我希望能夠包含一個會話幫助器,並且在評論模型中只需要一個beforesave方法執行類似'self.user_id = current_user'之類的操作。有什麼想法嗎? – 2011-02-18 20:48:06

+0

作爲一個附註,如果我在你的方法工作的模型的attr_accessible部分包含user_id。但正如我所說,我最好只喜歡通過會話設置user_id而不是通過post傳遞用戶變量,因爲imo似乎不太可能被篡改 – 2011-02-18 20:51:09