在Rails中触发Ajax调用嵌套资源

hquia 发布于 2019-03-09 ajax 最后更新 2019-03-09 14:33 0 浏览

我有以下建模:

  User 
  has_many :projects
Project 
  belongs_to :user
  has_many :tasks
Task 
  belongs_to :project
  has_many :workIntervals
WorkInterval 
  belongs_to :task
我把它作为嵌套的资源,例如:
resources :projects do
  resources :tasks do
    resources :work_intervals
  end
end
我从登录的current_user获取用户,这就是为什么我没有在URL中。 来自任务的WorkInterval用于记录用户一直在处理任务的时间。例如,周一从上午10点到周二上午10点。这是一项任务可以有几个WorkIntervals。 我希望能够在我处于任务页面时拥有一个“开始工作”的按钮。但是我没有看到我应该放入那个按钮,这是一个AJAX调用吗?如果是这样,我应该在form_for中传递什么?所以,说网址是:
/projects/:project_id/tasks/:task_id
我想要一个名为“开始工作”的按钮,而不是触发时,创建与该任务关联的新WorkInterval。 什么是代码来做一个正确的方式来做到这一点?
已邀请:

gest

赞同来自:

实际上,您希望在单击按钮时创建新的work_interval。我认为有两种方法可以实现这一目标。

  1. 您可以创建一个表单,该表单将POST到您指定的路径,链接将是提交按钮。像这样的东西:
    <%= form_for [@project, @task, Task.work_intervals.new] do |f| %>
    <%= submit_tag "Start working" %>
    <% end %>
    
  2. 另一种方法是修改默认资源路由,使您可以通过GET操作访问WorkIntervals控制器上的create方法。
    resources :projects do
      resources :tasks do
        resources :work_intervals do
          get :create, as: :create, on: :collection
        end
      end
    end
    
    您将获得上述操作的link_to。

iid

赞同来自:

执行AJAX调用的按钮代码应该是这样的(如果我没有正确的路径,请渲染rake路由并查看work intervals CREATE的路径是什么)。

<%= button_to "Start Working", projects_tasks_work_intervals_path(@task.project, @task), :method => :post, :remote => true %>
我猜你已经在控制器中有一个创建动作,所以你可以用params [:project_id]和params [:task_id]捕获项目和任务,并创建一个新的工作间隔,用Time.now设置开头。 如果您想要通知用户它已保存,您可以渲染create.js.erb并在其中放置一些javascript代码,这些代码将在请求结束后显示。 要渲染这段javascript代码,您必须在操作中包含respond_to块:
def create
    ..
    respond_to do |format|
      format.html
      format.js
    end
end