2011-05-26 41 views
1

有一段時間我被困在這個問題中。我試圖通過一個表單傳遞3個Id來將數據保存在我的數據庫中。Rails - 在表單中找不到Id

def new 
    @person = Person.find(params[:person]) 
    @honored = Person.find(params[:honored]) 
    @group = Group.find(params[:group_id]) 
    @honor = Honor.new 
end 

def create 
    @person = Person.find(current_person) 
    @honor = Honor.create(:group => Group.find(params[:group_id]), 
      :person => Person.find(params[:person]), 
      :honored => Person.find(params[:honored])) 
if @honor.valid? 
    flash[:success] = "Honor created." 
    redirect_to (:back) 
else 
    redirect_to (:back) 
end 
end 

在我看來,我叫new方法:

<% @asked_groupmembership.each do |agm| %> 
<%= link_to "Create Honor", new_honor_path(:group_id => @group.id, :person => current_person.id, 
    :honored => agm.member.id) %> 

我的形式:

<% form_for @honor do |f| %> 

<%= f.hidden_field :group_id, :value => @group.id %> 
<%= f.hidden_field :person, :value => current_person.id %> 
<%= f.hidden_field :honored, :value => @honored.id %> 

<div class="field"> 
<%= f.label :texto %><br /> 
<%= f.text_field :texto %> 
</div> 

當我點擊提交按鈕,我得到這個錯誤:

Couldn't find Group without an ID 

app/controllers/honors_controller.rb:22:in `create' 

{"utf8"=>"✓", 
"authenticity_token"=>"C7wofMY4VcyfdS10oc3iglex8nZVBMQ0Nh22nMiaOqs=", 
"honor"=>{"group_id"=>"39", 
"person"=>"2", 
"honored"=>"44", 
... 
       }, 
"commit"=>"Insert"} 

如何可以我解決這個問題? 謝謝。

## EDITED ##

class Honor < ActiveRecord::Base 
    belongs_to :person, :class_name => 'Person', :foreign_key => "person_id" 
    belongs_to :honored, :class_name => 'Person', :foreign_key => "honored_id" 
    belongs_to :group, :class_name => 'Group', :foreign_key => "group_id" 

回答

2

你需要更新您的創建方法:

def create 
    @person = Person.find(current_person) 
    @honor = Honor.create(:group_id => params[:honor][:group], 
      :person_id => params[:honor][:person], 
      :honored_id => params[:honor][:honored]) 
if @honor.save 
... 
end 

因爲提交表單後,你在PARAMS有你的數據[:榮譽。你可以看到,傳遞給在代碼中的控制器張貼在你的問題哈希:

"honor"=>{"group"=>"39", 
"person"=>"2", 
"honored"=>"44", 
+0

改變了答案......請看一看。 – 2011-05-26 12:27:43

+0

感謝它的工作,都是我的名字的錯誤,對不起!但是我在表格中傳遞的信息是空白的,任何想法? – Zeroz 2011-05-26 12:29:53

+0

在新建或創建方法? – 2011-05-26 12:31:10

0

爲了或使其稍微更具可讀性,讓我們做到這一點

形式:

<% form_for @honor do |f| %> 
    <%= f.hidden_field :group_id, :value => @group.id %> 
    <%= f.hidden_field :person_id, :value => current_person.id %> 
    <%= f.hidden_field :honored_id, :value => @honored.id %> 
    ... 
<% end %> 

控制器:

def new 
    @person = Person.find(params[:person]) 
    @honored = Person.find(params[:honored]) 
    @group = Group.find(params[:group_id]) 
    @honor = Honor.new 
end 

def create 
    @person = Person.find(current_person) 
    @honor = Honor.create(
    :group => Group.find(params[:honor][:group_id]), 
    :person => Person.find(params[:honor][:person_id]), 
    :honored => Person.find(params[:honor][:honored_id]) 
) 

    if @honor.save 
    ... 
    end 
end 

表單內的每個隱藏字段都會作爲參數到達控制器params[:honor]

現在,看看控制器有些東西看起來不太正確。如果沒有錯誤,create方法將創建一個新實例並保存該對象。打電話create,然後save將工作,但您可以撥打電話new(而不是create),然後save或只是繼續使用create,然後valid?。我個人認爲new然後save過程更清潔。

例子:

def create 
    @person = Person.find(current_person) 
    @honor = Honor.new(
    :group => Group.find(params[:honor][:group_id]), 
    :person => Person.find(params[:honor][:person_id]), 
    :honored => Person.find(params[:honor][:honored_id]) 
) 

    if @honor.save 
    ... 
    end 
end