14

私はレールに不慣れで、チェックボックスを介してブール値の値を変更し、jquery ajaxを使用しようとしています:

<%- @tasks.each do |task| %>
  <div class="task-wrapper">
    <%= check_box_tag 'completed', task.id , task.completed, :class => "task-check" %>
    <%= content_tag :span, task.task %>
    <%= content_tag :span, task.deadline %>
  </div>
<% end %>

そしてJavaScript:

$(".task-check").bind('change', function(){
  if (this.checked){
    var bool = this.checked ? 1 : 0;
    $.ajax({
      url: '/todos/toggle',
      type: 'POST',
      data: '{"task_id":"'+ this.value +'", "bool":"'+ bool +'"}'
    });
  }
  else {
    alert("no");
  }
});

次にコントローラー:

def toggle(task_id, bool)
  @task = Todo.find_by_id(task_id)

  if @task != nil?
    @task.update_attributes(:completed => bool)
  else
    set_flash "Error, please try again"
  end
end

最後にルート:

resources :todos do
  member do
    post 'toggle'
  end
end

コレクションも試みましたが、同じエラーが発生しました。

私がそれを試みるときはいつでも、私404 errorは行動を起こします。

何が問題ですか?

ありがとう

4

2 に答える 2

43

Rails 4 では、追加の JS や CSS を必要とせずにこれを行う方法があります。

<%= check_box_tag 'completed', task.id, task.completed,
      data: {
        remote: true,
        url: url_for(action: :toggle, id: task.id),
        method: "POST"
      } %>

remote: true入力に追加すると、jquery-ujs があらゆる方法でそれを ajax-y にすることが判明しました。Thoughtbotの「Rails jQuery UJS のツアー」では、これ (および利用可能な他の多くの優れた機能) に簡単に触れています。jQuery UJS wiki の「jQuery の控えめなスクリプト サポート」ページでも、これについて徹底的な作業が行われています

于 2016-01-07T00:44:10.470 に答える
16

次のことを試してください (他のすべてはそのままにしておきます)。

JavaScript:

$(".task-check").bind('change', function(){
  if (this.checked){
    $.ajax({
      url: '/todos/'+this.value+'/toggle',
      type: 'POST',
      data: {"completed": this.checked}
    });
  }
  else {
     alert("no");
  }
});

コントローラー:

def toggle
  @task = Todo.find(params[:id])

  if @task.update_attributes(:completed => params[:completed])
    # ... update successful
  else
    # ... update failed
  end
end

bundle exec rake routesRails が生成するパスを表示するには、 を参照してください。メンバーであるあなたの場合、 のpost 'toggle'ようなパスを取得する/todos/:id/toggleため、ajax で更新された URL になります。

コントローラーで:idは、パスの from は になりますparams[:id]。ajax リクエストからのデータも最終的にparamsハッシュされるため、params[:completed].

于 2013-03-22T14:50:53.383 に答える