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 中传递什么?因此,假设 URL 是:

/projects/:project_id/tasks/:task_id

而且我想要一个名为“开始工作”的按钮,而不是在触发时创建一个与该任务关联的新 WorkInterval。

做正确方法的代码是什么?

4

2 回答 2

0

实际上,您希望在单击按钮时创建一个新的 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
    

    您将有一个链接到上述操作。

于 2013-04-11T16:20:50.000 回答
0

执行 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
于 2013-04-11T16:25:31.527 回答