6

Task モデルのインデックス ページで、Task データベース テーブルのブール フィールド「complete」に対応するすべての行にチェックボックスを表示したいと考えています。

現在、コードは「Complete」メソッドに入りますが、ユーザーが行ったばかりのチェックボックスの値が含まれていません (つまり、ボックスをチェックしただけでは、「Complete」メソッドに true が渡されません)。

ユーザーが実行した値をどのように渡すことができますか?

/views/tasks/index.html.erb

<% @tasks.each_with_index do |task, i| %>
    <tr>
        <td><%= check_box_tag 'Complete', task.complete, task.complete, :data => {:remote => true, :url => url_for( :action => 'complete', :id => task.id, :complete => task.complete ), :method => :put}, :class => 'input-large' %></td>
    </tr>
<% end %>

/controllers/tasks_controller#complete

# PUT /complete/1
  def complete
    @task = Task.find(params[:id])
    p "inside complete"
    p "complete = #{params[:complete]}"
    @task.complete = 

      if @task.update_attributes(params[:task])
        p "inside update"
        render :text => "success" 
      else
        p "inside error"
      end

  end
4

4 に答える 4

5

jQuery を使用している場合は、クリック イベントを記述できます。

$('.input-large').click(function() {
  var checked; 
  if ($(this).is(':checked')) {
    checked = true;
  } else {
    checked = false;
  } 
  $.ajax({
      type: "POST",
      url: "/tasks/complete",
      data: { id: $(this).data('post-id'), checked: checked }
   });     
});
于 2013-03-29T05:00:27.903 に答える
2
check_box_tag 'complete', task.complete ? 'false' : 'true', task.complete, ...
:url => url_for( :action => 'complete', :id => task.id )

このようにして、コントローラで params[:complete] を取得できます。そして、チェックボックスを再レンダリングするために complete.js.erb を実装する必要があるため、次のクリックで逆の値が送信されます

または、クリックイベントでjsを実装できます

$('.input-large').on('click', function() {
  $.ajax({
    type: "PUT",
    url: "/tasks/complete/" + $(this).data('post-id')
    data: { complete: $(this).is(':checked') }
  });
});

チェックボックスにdata-post-idパラメーターを配置することを忘れないでください

于 2013-03-29T09:19:22.720 に答える