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 に含まれていません。

Task からの WorkInterval は、ユーザーが Task で作業している時間を記録するために使用されます。たとえば、月曜日の午前 10 時から火曜日の午前 10 時までです。つまり、タスクは複数の WorkIntervals を持つことができます。

タスクページにいるときに「作業を開始」するボタンを使用できるようにしたいと考えています。しかし、そのボタンに何を入れるべきかわかりません。それは AJAX 呼び出しですか? その場合、form_for に何を渡す必要がありますか? したがって、URL は次のようになります。

/projects/:project_id/tasks/:task_id

そして、トリガーされたときに「作業開始」と呼ばれるボタンが必要で、そのタスクに関連付けられた新しい WorkInterval を作成します。

そうするための正しい方法を行うためのコードは何でしょうか?

4

2 に答える 2

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 に答える
0

事実上、ボタンをクリックして新しい work_interval を作成したいとします。これを達成する方法は 2 つあります。

  1. 指定したパスに POST するフォームを作成でき、リンクが送信ボタンになります。このようなもの:

    <%= form_for [@project, @task, Task.work_intervals.new] do |f| %>
    <%= submit_tag "Start working" %>
    <% end %>
    
  2. もう 1 つの方法は、既定のリソース ルーティングを変更して、GET アクションを介して WorkIntervals コントローラーの create メソッドにアクセスできるようにすることです。

    resources :projects do
      resources :tasks do
        resources :work_intervals do
          get :create, as: :create, on: :collection
        end
      end
    end
    

    上記のアクションの link_to があります。

于 2013-04-11T16:20:50.000 に答える