Rails check_box_tag如何在ajaxily检查时传递值

在我的Task模型的索引页面上,我想显示一个对应于我的Task数据库表中的boolean字段“complete”的每一行的复选框。

目前我的代码进入方法“完成”,但它不包含用户刚刚执行的复选框的值(即,如果他们只是选中了框,则它不会传递给我的“完整”方法)。

我如何传递用户刚刚执行的值 – 是选中还是未选中?

/views/tasks/index.html.erb

   {:remote => true, :url => url_for( :action => 'complete', :id => task.id, :complete => task.complete ), :method => :put}, :class => 'input-large' %>   

器/控制器/ tasks_controller#完整

 # 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 

如果您使用的是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 } }); }); 

从Rails 4开始,您应该能够从原始答案中删除所有JS。 由于jQuery UJS魔法,你问题中的代码应该正常工作。

事实certificate,将remote: true添加到输入会导致jquery-ujs以所有好方式使其成为ajax-y。 Thoughtbot的“Rails之旅jQuery UJS”简要介绍了这个(以及其他许多好东西); jQuery UJS wiki中的“对jQuery的不显眼的脚本支持”页面也对此做了全面的工作。

rails / jquery-ujs github repo中这个问题的建议对我有用: https : //github.com/rails/jquery-ujs/issues/440#issuecomment-197029277

对你来说它将是:

 <%= check_box_tag 'complete', '1', task.complete, { onchange: "$(this).data('params', 'complete=' + this.checked)", data: { url: url_for(action: 'complete', id: task.id,), remote: true, method: :patch }, } %> 
 check_box_tag 'complete', task.complete ? 'false' : 'true', task.complete, ... :url => url_for( :action => 'complete', :id => task.id ) 

这样在你的控制器中你可以得到params [:完整]。 并且您应该实现complete.js.erb以重新呈现复选框,因此下一次单击将发送反向值

或者您可以在click事件上实现js

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

并且不要忘记将data-post-id param放入您的复选框