在对象的edit()下提交以在不同对象下创建()

时间:2013-12-20 19:42:12

标签: ruby-on-rails ruby-on-rails-3 forms input

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"}

1 个答案:

答案 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

请注意我的代码正在跳过所有验证和错误管理。