【问题标题】:Rails + simple_form + remote_true + custom controller: how to handle different form actions for 'new' and 'edit'?Rails + simple_form + remote_true + 自定义控制器:如何处理“新建”和“编辑”的不同表单操作?
【发布时间】:2015-01-17 06:08:55
【问题描述】:

我基本上遵循本教程:http://www.gotealeaf.com/blog/the-detailed-guide-on-how-ajax-works-with-ruby-on-rails 有一个变化:在为“任务”(控制器、模型、视图...)创建脚手架之后,我创建了一个名为“demo”的新控制器,以测试 ajax 方式。所以“演示”控制器有以下动作:index、new_task、create_task、edit_task、update_task。路线也调整了。

当我呈现表单时 (app/views/demo/_form.html.erb)

<%= simple_form_for @task, remote: true do |f|   %>
  <%= f.input  :description                      %>
  <%= f.input  :deadline                         %>
  <%= f.button :submit                           %>
<% end %>

'action' 的形式将是 '/tasks',对应于 'controller:tasks, action:create',但该控制器用于“旧 html”方式,而 ajax 内容位于“demo”控制器中.

所以,根据网上找到的一些答案,我添加了“url”参数:

<%= simple_form_for @task, remote: true, url: '/demo/create_task' do |f|   %>
  <%= f.input  :description                      %>
  <%= f.input  :deadline                         %>
  <%= f.button :submit                           %>
<% end %>

在这种情况下,它适用于“新建/创建”操作。但是当需要更新模型时,它应该使用“/demo/update_task”路径。 Rails 用哪种方式来处理这个问题?

  1. 在表单前添加一行:

  2. 有两种不同的表单,一种用于创建,另一种用于编辑,因此“new_task.js.erb”将指向“_form_for_creating.html.erb”,“edit_task.js.erb”将指向另一个一。实际上不是很干。

  3. 更丑陋的:: 让 'tasks' 控制器重定向到 'demo' 控制器中的 'update_task'。我不会依赖这个,因为任务控制器应该在一些测试后被删除。

【问题讨论】:

    标签: javascript ruby-on-rails ajax


    【解决方案1】:

    最后还是选择在表格前加一行:

    <% url = @task.new_record? ? "/demo/create_task" : "/demo/update_task?id=#{@task.id}" %>
    <%= simple_form_for @task, remote: true, url: url do |f|   %>
      <%= f.input  :description                      %>
      <%= f.input  :deadline                         %>
      <%= f.button :submit                           %>
    <% end %>
    

    我觉得它并不完美,但它确实有效。

    当然有几点需要调整:

    • 添加路线patch 'demo/update_task'
    • Demo 控制器中的update_task 应该在更新属性后加载所有任务

    【讨论】:

    • 如果它允许您重用表单,那么区分 url 并没有错。我喜欢使用 = simple_form_for @task, url: url_for(controller: 'demo', action: 'create'), method: 'post' do |form| 的简单形式的路由助手
    猜你喜欢
    • 2019-01-17
    • 1970-01-01
    • 2011-08-18
    • 1970-01-01
    • 1970-01-01
    • 2012-07-31
    • 1970-01-01
    • 1970-01-01
    • 2010-09-25
    相关资源
    最近更新 更多