2013-04-13 43 views
2

我有兩個獨立的「組件」模型,聯繫人和文章。聯繫人有多種類型(生產者,出口商等)。Rails 3,更改或填寫控制器中提交的表單值

在新的文章表單中,我有一個帶有聯繫人(id和title)的下拉選擇器,並且希望將所選的值和文本存儲在文章表中。

在新的文章表單視圖:

<%= f.select :producer_id, options_for_select(producers, @article.producer_id) %> 

這一工程,並producer_id存儲在文章表。

那清晰的邏輯給我,但在某些情況下,我還需要存儲選擇的聯繫人的標題producer_title

我看過像許多不同的選擇「模型做,保存之前」或「做在控制器」,我已經做了內部控制。

條控制器(僅適用於部分來自更新):

#cont_name is producer title from Contacts 
def update 
    params[:article][:producer_title] = Contact.where(id: params[:article][:producer_id]).pluck(:cont_name).first 
end 

這工作,但它是最好的實踐方法解決這個問題?

另外,爲什麼我不能得到它的工作,如果我改變params[producer_id]部分使用:id: params[:producer_id]

最好的問候和謝謝。

回答

0

如何像下面這樣來代替:

def edit 
    @article = Article.find(params[:id]) 
    @producers = Contact.where(type: "producer") # or however you distinguish between producers and other contacts 
end 

然後在你的形式將其更改爲:

f.select :producer_id, options_from_collection_for_select(@producers, "cont_name") 
# you might need to do (@producers, "cont_name", "cont_name"), can't quite remember 

那麼你的更新動作會更簡單:

def update 
    @article = Article.find(params[:id]) 
    if @article.update_attributes(params[:article]) 
    ... 
    else 
    ... 
    end 
end 

:id => params[:producer_id]不起作用的原因是params是一個嵌套的H,所以像:

params = { :article => { :producer_id => 34, :title => "Cool Article" }, :another_key => { :key => :value } } 

所以訪問producer_id您必須首先檢索article哈希值,否則只會通過第一組按鍵,上面包括articleanother_key的例子看,但不要不包括producer_id