【问题标题】:How do I set two different actions from a rails form?如何从 rails 表单设置两个不同的操作?
【发布时间】:2013-03-05 22:18:11
【问题描述】:

我有一个创建(和更新)材质的 rails 表单。显然,默认情况下,当用户登录并检索材料时,表单会呈现更新操作。但是,我希望有一个“另存为”操作,以防用户想要保存另一个版本的材料。这样做的明显方法是在控制器中设置一个发送到“更新”的按钮,另一个发送到“新”的按钮,但我不知道如何执行此操作,因为它似乎取决于 form_for 参数。

更新

为避免使用 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 

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

【问题讨论】:

  • 听起来是个坏主意。仅在服务器端适当地处理表单怎么样?您可以从一个控制器委托到您需要的任何地方。这种形式在浏览器中太容易弄乱了。
  • 您可以添加一个复选框以了解用户是要创建新版本还是保存实际版本。而在服务器端,只需检查复选框是否已被选中并委托给适当的方法。
  • 通过重定向您会丢失从表单中发布的所有数据。所以你的choose_action 想法确实是疯狂
  • @Mischa 是的,我很担心。有没有办法将数据传递给下一个动作?

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


【解决方案1】:

你可以用一些 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

额外的代码块使表单提交一个放置请求而不是一个帖子,随后映射到控制器的更新操作。要让它将表单发送到创建操作,您需要发布操作“/email”。换句话说,你想把上面的代码操作成类似

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

注意删除了 div 标签。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-19
    • 1970-01-01
    • 2015-04-10
    • 1970-01-01
    • 2021-01-06
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多