0

私は次のコードを持っています:

タスク/_form.html.haml

%h3 
    Tasks
%span.form-inline.centered
    = form_for [@activity, @task], remote: true do |f|
        = f.text_field :description, {placeholder: 'Enter task description and click + to create a new task', class: 'input-task'}
        = f.submit "+", class: 'btn btn-danger'

controllers /tasks_controller.rb

  def create
    activity = Activity.find(params[:activity_id])

    flash[:error] = I18n.t "errors.task.generic" if !activity.add_task!(params[:task])    

    @task = activity.tasks.last

    respond_to do |format|
      format.html { redirect_to activity_path(activity) }
      format.js
    end
  end

タスク/create.js.erb

$('#incomplete-tasks').append("<%= j render partial: 'task', locals: {task: @task} %>");

タスク/_task.html.haml

%li
    = task.description
    = link_to "Done", activity_task_path(task.activity, task: task), html_options = {method: :put, class: 'pull-right'}

私が抱えている問題は、jsを使用してRESTfulリソースの一部をレンダリングしようとすると、activity_task_path指定しているputメソッドの代わりにgetメソッドが送信されることです。jsを使用せずにレンダリングし、ブラウザを更新するだけで問題なく動作します。表示ページがないため、ルーティングエラーが発生します。ただし、必要ありません。putメソッドを介してタスクを更新するために必要です。なぜこれが起こっているのかを誰かが明らかにすることができれば、私はそれをいただければ幸いです。

[編集1]

ご不明な点がある場合や、コードなどを追加する必要がある場合は、お知らせください。なぜこれが起こっているのか本当にわかりません。ありがとうございました。

[編集2]

  def update
    activity = Activity.find(params[:id])
    activity.update_task!(params[:task])
    redirect_to activity_path(params[:id])
  end

これは私のアップデートコントローラーです。

[編集3]

https://trackit.mlpinit.comでアプリをオンラインで見つけて、私がやろうとしていることをよりよく理解することができます。確認を2.daysに設定したランダムなメールアドレスで認証できます。

[編集4]

もっと明確にしたいと思っています...ajaxを介して新しいタスクを追加したときに発生するエラーは次のとおりです。

ルーティングエラー

ルートが一致しません

 {:action=>"show", :controller=>"tasks", :task=>#<Task id: 64, description: "lalala", complete: false, created_at: "2012-10-11 19:41:22", updated_at: "2012-10-11 19:41:22", activity_id: 6>, :activity_id=>#<Activity id: 6, title: "Lala", description: "this is lala", created_at: "2012-10-10 18:37:18", updated_at: "2012-10-10 18:37:18", user_id: 2, activity_group_id: nil>}

もう一度、ajax呼び出しでこれを行わなければ、問題なく動作します。なんらかの理由でputメソッドがわからないので問題が発生しているのではないかと思います...

[編集5]

_taskパーシャルからリンクを取得すると、エラーなしで追加が行われます。私はそれを言及する必要があると思いました

[編集6]

自分自身を確実に理解できるように、視覚的なウォークスルーを追加します...

私はタスクフォームを持っています:

タスクフォーム

タスク名を入力します

ここに画像の説明を入力してください

プラスを押して作成します。

上記にも示されている次のエラーが発生します。

ここに画像の説明を入力してください ここに画像の説明を入力してください

更新を押すと、タスクが生成されました。

ここに画像の説明を入力してください

そのため、.js.erbファイルに含める必要があると思います...

4

3 に答える 3

1

見てくださいrake routes | grep task

  activity_task GET    /activities/:activity_id/tasks/:id(.:format)      tasks#show
                PUT    /activities/:activity_id/tasks/:id(.:format)      tasks#update

次に、ブラウザで問題を引き起こす生成されたリンクを調べ、それがupdateルートに対応しているかどうか、およびdata-method="put"属性があるかどうかを確認します。

わかりました。ログインして確認しました。生成されたリンクは適切ではありません。

<a href="/activities/17/tasks/17?task=5" class="pull-right" data-method="put" rel="nofollow">Done</a>

17?task=5パーツがめちゃくちゃになっている場合は、次のようになります/activities/17/tasks/5

[編集]

リンクを変更します。

= link_to "Done", activity_task_path(:activity_id => task.activity_id, :id => task.id), html_options = {method: :put, class: 'pull-right'}

ルーティングエラーは、:activity_idの下にidだけでなくオブジェクトがあり、属性は不要であり、タスクID値:taskが必要であることを示しています。:id

于 2012-10-11T13:38:20.133 に答える
1
activity_task_path(task.activity, task: task)

activity_task_path には 2 つの id パラメータが必要です。最後はタスクと混合されていると思います: task および post パラメータ。また、form_for が原因で混乱が生じ、このメソッドをタスクに「更新」を使用しようとしています。データ フィールドを指定していません。

だから私はあなたの解決策は次のとおりだと思います:

activity_task_path(task.activity, task)
于 2012-10-11T13:49:15.627 に答える
0

Railsの控えめなJavaScriptドライバーrails.jsをロードしていることを確認していますか?次の行がGemfileにあることを確認します。

gem 'jquery-rails', '~> 2.1'

また、Rails 3.1を使用している場合は、それをapplication.jsに含めます。

//= require jquery
//= require jquery_ujs

インストールの詳細な手順が必要な場合は、これをチェックしてください。

于 2012-10-11T13:06:01.807 に答える