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放入您的复选框