如何从rails表单中设置两个不同的操作?

时间:2013-03-05 22:18:12

标签: ruby-on-rails-3 form-for

我有一个用于创建(和更新)材料的rails表单。显然,默认情况下,当用户登录并检索材料时,表单将使用更新操作进行渲染。但是,我希望有一个“另存为”动作,以防用户想要保存另一个版本的材料。显而易见的方法是让一个按钮发送到控制器中的“更新”,另一个按钮发送到“新”,但我不知道怎么做,因为它似乎依赖于form_for参数。 / p>

更新

为避免使用Javascript,我尝试将form_for url更改为:

<%= form_for @material, :url => choose_action_path do |f| %>

然后在控制器中我有:

def choose_action
  if params[:save_as] == "Save As"
    redirect_to :action => "create"
  else
    redirect_to :action => "update"
  end
end 

但这不起作用。这是一个可行的策略还是这个疯狂?

1 个答案:

答案 0 :(得分:0)

你可以用一些jquery做到这一点。

假设您正在处理的模型称为电子邮件。编辑电子邮件时,使用操作action='/emails/:id和方法method='post'创建的表单标记。隐藏在表单标签下面的是

<form accept-charset="UTF-8" action="/email/1" method="post">
  <div style="margin:0;padding:0">
    <input name="_method" type="hidden" value="put" />
    <input name="utf8" type="hidden" value="&#x2713;" />
    <input name="authenticity_token" type="hidden" value="f755bb0ed134b76c432144748a6d4b7a7ddf2b71" />
  </div>

可在此处找到更多信息:http://guides.rubyonrails.org/form_helpers.html#how-do-forms-with-put-or-delete-methods-work

额外的代码块使表单提交put请求而不是post,后来映射到控制器的更新操作。要将表单发送到创建操作,您需要发布操作“/ email”。换句话说,您希望将上面的代码操作为类似

的内容
<form accept-charset="UTF-8" action="/email" method="post">

请注意删除div标签。

所以我的建议是创建一个“另存为”按钮,然后添加一些jquery,当点击“另存为”按钮时将进行这些修改。

此stackoverflow答案可能会帮助您使用jquery Jquery to change form action