【问题标题】:Manage Single Rails form to other controller with create and update action使用创建和更新操作将单个 Rails 表单管理到其他控制器
【发布时间】:2013-04-10 18:41:52
【问题描述】:

我是 Rails 新手。我使用 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

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

【问题讨论】:

    标签: ruby-on-rails controller routes form-for


    【解决方案1】:

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

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

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

    并更改您的 form_for 如下所示

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

    【讨论】:

      【解决方案2】:

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

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

      希望这会有所帮助。

      【讨论】:

      • 当您使用脚手架语句创建资源时,更新和创建操作都会自动生成一个表单。我想实现同样的事情,但对于外部控制器,如果可能的话。现在我解决了,正如我在编辑部分中解释的那样。感谢您的帮助!
      【解决方案3】:

      首先,如果你想更新一些东西,这个对象应该存在。 打算怎么弄,我不知道(因为方法不同,取决于背景)。

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

      例如:

      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
      

      【讨论】:

      • 那么,对于这两种情况,需要两种不同的文件形式吗?
      • 可以,但您只能在视图中显示一个。但在我看来,构建应用程序逻辑通常不是一个好主意。
      • 现在,我解决了检查表单文件中是否存在对象的问题,如果存在,我使用 UPDATE 操作路径设置一个变量,否则,我使用 CREATE 操作路径设置一个变量。因此,在 form_for 语句中,我将 url_for 与上述变量一起使用。我认为这不是最好的方法,但它有效,我只能使用一个表单文件。
      猜你喜欢
      • 2011-09-25
      • 1970-01-01
      • 2015-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多