2011-12-18 144 views
1

我是Rails的新手(對於編程來說相當新穎),我正在爲自己構建一個Web應用程序作爲學習的方式。現在我正在修改腳手架表格等。Rails語法將POST參數從表單傳遞給控制器​​

我的問題是在我的控制器中的「創建」方法。有兩個我關心的實體:用戶表和Habit表。我在_form創建一個下拉框部分的習慣看法,讓一個人從所有可用的列表創建一個習慣如下

<%= collection_select :user, :id, @users, :id, :first_name %> 

習慣控制器時,選擇用戶,當然有

def new 
    @users = User.all 
    ...  
end 

這工作得很好,當表單提交時發佈兩個哈希參數:習慣和:用戶。現在,當我想要在create方法中處理表單輸入時,我不確定如何正確使用該語法並將user_id分配給新創建的習慣。我想要做的是這樣的事情

def create 
    @habit = Habit.new(params[:habit], params[:user]) 
end 

這當然是不正確的語法。

def create 
    @habit = Habit.new(params[:habit]) 
end 

正確地分配來自:habit hash的params,但是然後user_id保持未設置狀態。

有效的是以下內容,但代碼非常冗長,需要手動分配每個值。

def create 
    @habit = Habit.new(:user_id => params[:user][:id], 
        :description => params[:habit][:description], 
        :habit_method => params[:habit][:habit_method], 
        :time_reqd => params[:habit][:time_reqd], 
        :will_reqd => params[:habit][:will_reqd], 
        :active => params[:habit][:active]) 

end 

所以我的問題是,有一種形式,在多個散列數據發佈,什麼是這些參數傳遞到控制器中的一些方法的正確方法處理時?

回答

2

所以我的問題是,當處理一個窗體在多個散列中發佈數據時,將這些參數傳遞到控制器中的某些方法的正確方法是什麼?

而不是說Habit.new(<lots of stuff>),只是使用Habit.new(params[:habit])。 Rails會嘗試將散列中的每個鍵(在本例中爲params[:habit]散列鍵)分配給對象上的匹配值。

因此,如果params [:habit]有一個:description鍵,它將被分配到模型上的一個名爲description的字段。這被稱爲大規模轉讓,非常方便。

現在,你可以這樣做:

@habit = Habit.new(params[:habit]) 
@habit.user_id = params[:user][:id] 

您可能需要閱讀RoR Getting Started Guide,像this section,爲Rails的更多類似的便捷功能。

+0

啊,OK。所以大規模的任務是一種捷徑。這就說得通了。還有一個語法問題:如果:用戶散列有多個鍵(在前面的例子中它只有一個),這個散列是否會分配散列「@habit = params [:user]'?換句話說,你可以在現有的對象上使用質量分配嗎?非常感謝您的幫助! – bknoles 2011-12-18 23:20:50

+0

否; '@habit = params [:user]'複製了'params [:user]'對象(這是一個散列),因此你所做的只是用這個覆蓋'@習慣'。不過,您可以執行'@habit.attributes = '。 – 2011-12-19 14:46:09

0

變化

<%= collection_select  :user, :id, @users, :id, :first_name %> 

<%= collection_select  :habit, :user_id, @users, :id, :first_name %> 

現有的腳手架代碼應該只是工作後

備用

<%= f.select :user_id, @users, :id, :first_name %> 
+0

謝謝!這些例子幫助我理解select,collection選擇等的參數。 – bknoles 2011-12-18 23:29:36

相關問題