Javascript 轨道&x2B;简单形式+;远程#u true+;自定义控制器:如何处理';新';和';编辑';?

Javascript 轨道&x2B;简单形式+;远程#u true+;自定义控制器:如何处理';新';和';编辑';?,javascript,ruby-on-rails,ajax,Javascript,Ruby On Rails,Ajax,我基本上遵循本教程: 有一个变体:在为“任务”(控制器、模型、视图……)创建了一个脚手架之后,我创建了一个名为“demo”的新控制器,以测试ajax方式。因此,“演示”控制器具有以下操作:索引、新建任务、创建任务、编辑任务、更新任务。路线也进行了调整 当我呈现表单时(app/views/demo/_form.html.erb) 表单'action'将是'/tasks',对应于'controller:tasks,action:create',但该控制器是用于“旧html”方式的,而ajax内容

我基本上遵循本教程: 有一个变体:在为“任务”(控制器、模型、视图……)创建了一个脚手架之后,我创建了一个名为“demo”的新控制器,以测试ajax方式。因此,“演示”控制器具有以下操作:索引、新建任务、创建任务、编辑任务、更新任务。路线也进行了调整

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


表单'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\u task”路径。Rails采用哪种方式处理此问题

  • 在表单前添加一行:

  • 有两个不同的表单,一个用于创建,另一个用于编辑,因此'new_task.js.erb'将指向'u form_for_creating.html.erb','edit_task.js.erb'将指向另一个。其实不是很干

  • 更难看的是:让“任务”控制器重定向到“演示”控制器中的“更新任务”。我不相信这一点,因为任务控制器应该在一些测试之后被删除


  • 我最终选择在表单前添加一行:

    <% 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 %>
    
    
    
    我觉得它不完美,但很管用

    当然,有一些事情需要调整:

    • 添加路线
      补丁“演示/更新任务”
    • 演示控制器中的
      update_task
      应在更新属性后加载所有任务

    如果url允许您重用表单,那么区分url没有什么错。我喜欢为simpleforms使用路由帮助程序,其中@task的路径帮助程序
    =simple\u form\u,url:url\u(控制器:“演示”,操作:“创建”),方法:“post”do | form |
    <% 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 %>