3

我是新来的铁路。我使用 rails 3.0.5 。

我有一个 EMPLOYEE 资源,但我想用另一个外部控制器 (emp_profile_controller) 来管理它。这个外部控制器 (emp_profile_controller) 管理一些操作 (index, new_employee, create_employee, edit_employee, update_employee 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_for 有效,例如:

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

但是我怎样才能用一种形式处理这两个动作呢?

感谢您的光临,如果我问了一个愚蠢的问题,我深表歉意。

编辑

现在,我解决了检查表单文件中是否存在对象,如果存在,我使用 UPDATE 操作路径设置一个变量,否则,我使用 CREATE 操作路径设置一个变量。因此,在 form_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

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

4

3 回答 3

1

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

resources :employees,:controller=>"emp_profile",:path=>"emp_profile"

将create_employee、update_employee的方法名分别更改为create和update。

并更改您的 form_for 如下所示

<%= form_for @employee do |f| %>
....
<% end %>
于 2015-05-25T08:21:03.840 回答
0

首先,如果你想更新一些东西,这个对象应该存在。计划如何找到它,我不知道(因为方法不同,取决于背景)。

有两种方法可以解决这个问题。您可以只检查视图文件中是否存在对象,如果存在,则引用表单进行更新,否则进行创建。另一种方法是在控制器中进行。

例如:

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
于 2013-04-17T22:54:15.803 回答
0

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

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

希望这可以帮助。

于 2013-04-18T11:07:50.573 回答