2013-12-20 54 views
0

下的Ruby on Rails的3下對象創建()的編輯()提交不同的對象

我的編輯頁面,我的經銷商對象有一個按鈕即可提交所選用戶的USER_ID。表單POST正確的user_id,但使用reseller_controller的edit()方法。我希望它做的是在帶有POSTed user_id的證書表下創建一個新記錄。我很困惑,但應用程序似乎引用了certificates_controller的create()方法。除了發送POST之外,它什麼也不做。我錯過了什麼?

我的模型:

class Certificate < ActiveRecord::Base 
attr_accessible :attend, :pass, :user_id 
validates :user_id, presence: true 
end 

我與編輯()

def edit 
    @trained = Certificate.new(params[:certificate]) 
    @trained.save 
end 

我certificate_controller與創建()

def create 
    @trained = Certificate.new(params[:certificate]) 
    @trained.save 
end 

我edit.html.erb與按鈕reseller_controller

<%= form_for(@trained) do |f| %> 
    <%= select_tag "certificate[user_id]", options_for_select(@current_users.collect{|x| [x.name, x.id]}), {:multiple => :multiple} %> 
    <%= f.submit "Trained", class: "btn btn-large btn-primary" %> 
<% end %> 

這是當我點擊按鈕的日誌:

Started POST "/certificates" for 50.241.102.234 at 2013-12-20 10:54:43 -0800 
Processing by CertificatesController#create as HTML 
Parameters: {"utf8"=>"✓", "authenticity_token"=>"xYUdeMjkxa1b0AhNTKJi9sDbSPo9MbwMMVPrV7cgpyo=", "certificate"=>{"user_id"=>"16"}, "commit"=>"Trained"} 

回答

1

編輯控制器應返回現有的實例,你是返回一個新的實例。

def edit 
    @trained = Certificate.new(params[:certificate]) 
    @trained.save 
end 

應該

def edit 
    @trained = Certificate.find(params[:id]) 
end 

編輯操作將發佈到更新動作

def update 
    @trained = Certificate.find(params[:id]) 
    @trained.update_attributes(params[:certificate]) 
end 

form_for(@trained)的行爲取決於中無論您是通過一個新的記錄或沒有兩種不同的方式。如果記錄是新的,則記錄POST /create,如果記錄持續存在PUT /update

請注意,我的代碼正在跳過所有的驗證和錯誤管理。

+0

更新方法應該在我的certificates_controller權限? – DDDD

+0

是的,所有的代碼應該在同一個控制器中。 –

+0

儘管證書記錄不存在,但必須創建證書記錄。現在,沒有一個用戶擁有與之關聯的證書記錄,所以我需要第一次創建一個新證書。 – DDDD