我有一个用于创建(和更新)材料的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
但这不起作用。这是一个可行的策略还是这个疯狂?
答案 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="✓" />
<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