Ruby on rails 使用创建和更新操作将单个Rails表单管理到其他控制器

Ruby on rails 使用创建和更新操作将单个Rails表单管理到其他控制器,ruby-on-rails,controller,routes,form-for,Ruby On Rails,Controller,Routes,Form For,我是rails的新手。我使用rails 3.0.5 我有一个员工资源,但我想用另一个外部控制器(emp_profile_controller)来管理它。 此外部控制器(emp_profile_controller)管理一些操作(索引、新员工、创建员工、编辑员工、更新员工ecc..) 此控制器的路径为: controller :emp_profile do get 'emp_profile' => :index get 'emp_edit_profile' => :edit_emplo

我是rails的新手。我使用rails 3.0.5

我有一个员工资源,但我想用另一个外部控制器(emp_profile_controller)来管理它。 此外部控制器(emp_profile_controller)管理一些操作(索引、新员工、创建员工、编辑员工、更新员工ecc..)

此控制器的路径为:

controller :emp_profile do
get 'emp_profile' => :index
get 'emp_edit_profile' => :edit_employee
put 'emp_edit_profile' => :update_employee
get 'new_employee' => :new_employee
post 'new_employee' => :create_employee
get 'emp_list' => :emp_list
end
如何使用一个表单来处理此控制器中的创建和更新操作

我试过:

form_for(@employee, :url => { :controller => "emp_profile"}) do |f|
但它不起作用

如果我一次只管理一个操作(创建或更新),则url_用于works,例如:

form_for(@employee, :url => { :controller => "emp_profile", :action => "update_employee" }
但是我如何用一个表单处理这两个操作呢

感谢您的光临,如果我问了一个愚蠢的问题,我向您道歉

编辑


现在,我解决了检查表单文件中是否存在对象的问题,如果存在,我将使用更新操作路径设置变量,否则,我将使用创建操作路径设置变量。因此,在形式_for语句中,我将url_for与上述变量一起使用

<% if @employee.new_record?
  action = "create_employee"
  method = "post"
 else
  action = "update_employee"
  method = "put"
end
 %>

form_for(@employee, :url => { :controller => "emp_profile", :action => action }, :method => method

(@employee,:url=>{:controller=>“emp\u profile”,:action=>action},:method=>method)的表单

我不认为这是最好的方法,但它很有效,我只能使用一个表单文件。

首先,如果要更新某些内容,此对象应该存在。 我不知道你打算怎么找到它(因为有不同的方法,取决于背景)

解决这个问题有两种方法。 您只需检查视图文件中是否存在对象,若存在,请重新提交表单进行更新,否则进行创建。 另一种方法是在控制器中执行

例如:

def create
@employee=Employee.find_by_name('Jack Black') #for example
if @employee!=nil
render :action=> 'update'
else
@employee=Employee.new(:employee)
@employee.save
end

据我所知,您希望使用表单提交在同一控制器上执行两个不同的操作,这是不可能的,您只能使用表单提交执行一个操作, 因为表单正在到达一个动作控制器,该动作应该在其执行代码的末尾呈现一些视图,如果可以使用表单上的动作,rails将如何知道要呈现哪个视图??(这就是为什么不可能的原因)

如果你想在控制器上执行更多的代码,正确的方法是调用一个包含你想执行的代码的方法,该方法应该在模型中, 因为在模型中编写大量代码并尽可能使控制器远离代码是一种很好的做法:-)


希望这有帮助。

由于您的型号名称和控制器名称不同,您可以将此线路添加到路由中

resources :employees,:controller=>"emp_profile",:path=>"emp_profile"
将create_employee和update_employee的方法名称分别更改为create和update

并更改您的表格,如下所示

<%= form_for @employee do |f| %>
....
<% end %>

....

那么,对于这两种情况,都需要两个不同的文件表单?是的,但您只能在视图中显示一个。但在我看来,构建应用程序逻辑通常不是一个好主意。目前,我解决了检查表单文件中是否存在对象的问题,如果存在,我用更新操作路径设置变量,否则,我用创建操作路径设置变量。因此,在形式_for语句中,我将url_for与上述变量一起使用。我不认为这是最好的方法,但它是有效的,我只能使用一个表单文件。当您使用scaffold语句创建资源时,会自动为更新和创建操作创建一个表单。我想实现同样的事情,但对于一个外部控制器,如果可能的话。现在我已经解决了,正如我在编辑部分所解释的。谢谢你的帮助!