Ruby on Rails 3
我的转销商对象的编辑页面有一个按钮,用于提交所选用户的user_id。表单POST了正确的user_id,但正在使用reseller_controller的edit()方法。我想要它做的是使用POSTed user_id在Certificate表下创建一个新记录。我很困惑,因为应用程序似乎引用了certificate_controller的create()方法。除了发送POST之外它什么都不做。我错过了什么?
我的模特:
class Certificate < ActiveRecord::Base
attr_accessible :attend, :pass, :user_id
validates :user_id, presence: true
end
我的reseller_controller与edit()
def edit
@trained = Certificate.new(params[:certificate])
@trained.save
end
我的certificate_controller with create()
def create
@trained = Certificate.new(params[:certificate])
@trained.save
end
我的edit.html.erb带有按钮
<%= 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"}
答案 0 :(得分: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
。
请注意我的代码正在跳过所有验证和错误管理。