2013-04-13 37 views
0

假設我有兩個型號:什麼是解決belongs_to的關聯質量分配適當的方式

class Article < ActiveRecord::Base 
    belongs_to :category 
    attr_accessible :content 

    validates :content, :category, :presence => true 

end 

class category < ActiveRecord::Base 
    attr_accessible :name 
    has_many :articles 
end 

我創建一個表單來增加新的文章,並在此形式想給用戶從列表中選擇一個類別的可能性。

= form_for([:admin,@article] , :html => {:multipart => true}) do |f| 


    = f.label :category 
    = f.collection_select(:category, Category.all, :id, 
     :name,{:prompt => 'select category'}, {:style => 'height:50px;'}) 

    = f.label :content 
    = f.text_area :content, class: 'tinymce', cols:60, rows: 15 
    %hr 

    = f.submit 'send' 

當我提交表單我收到錯誤無法批量分配受保護的屬性:類別,我明白。 要解決的問題,我已經添加CATEGORY_ID條的attr_accessible和改變形式:

= f.label :category_id 
= f.collection_select(:category_id, Category.all, :id, 
    :name,{:prompt => 'select category'}, {:style => 'height:50px;'}) 

然後一切工作正常(我可以創建與數據庫相關的CATEGORY_ID文章對象),但我不認爲這是正確的方式。 下面是我在ArticlesController

def create 
    @article = Article.new(params[:article]) 
    if @article.save 
     redirect_to([:admin,@article]) 
    else 
     render 'new' 
    end 

    end 

創建操作有人能解釋我如何改進這一點。

+2

看起來好像沒什麼問題 –

+0

我不知道是很奇怪的是後添加「belongs_to的:類」我也必須添加CATEGORY_ID到attr_accesible保存的對象 – Karol85

+0

它是安全的,你的平均實際實現您允許做什麼通過爲屬性定義白名單來請求。 – ted

回答

1

如果你不想讓屬性質量分配,你將需要調用它直接使用它的名字:

def create 
    @article = Article.new(params[:article][:content]) 
    @article.category_id = params[:article][:category_id] 
    if @article.save 
    redirect_to([:admin,@article]) 
    else 
    render 'new' 
    end 

end 

在這種情況下,大衆分配漏洞看起來不起眼,所以離開它可用的可能是好的。你想要避免的是暴露任何屬性,用戶可以通過發送任意形式的POST惡意設置你的模型的屬性(如user.admin標誌)。

+0

感謝您的澄清,現在對我來說很清楚。 – Karol85

相關問題