Rails + simple_form + remote_true +自定义控制器:如何处理' new'的不同表单操作和'编辑'?

时间:2014-11-19 16:16:34

标签: javascript ruby-on-rails ajax

我基本上都在关注本教程:http://www.gotealeaf.com/blog/the-detailed-guide-on-how-ajax-works-with-ruby-on-rails 有一个变化:为'任务'(控制器,模型,视图......)创建一个脚手架后,我创建了一个名为' demo '的新控制器来测试ajax方式。因此'demo'控制器具有以下操作: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',但该控制器用于“old 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 %>

在这种情况下,它适用于'new / create'操作。但是当需要更新模型时,它应该使用'/ demo / update_task'路径。哪个是Rails处理这个问题的方法?

  1. 在表单前添加一行:&lt;%url = @ task.new_record? ? “/ demo / create_task”:“/ demo / update_task?id =#{@ task.id}”%&gt;

  2. 有两种不同的形式,一种用于创建,另一种用于编辑,因此'new_task.js.erb'将指向'_form_for_creating.html.erb','edit_task.js.erb'将指向另一种一。实际上并不是很干。

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

1 个答案:

答案 0 :(得分: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'
  • 演示控制器中的
  • update_task应在更新属性后加载所有任务