6

在我的任务模型的索引页面上,我想为与任务数据库表中的布尔字段“完成”对应的每一行显示一个复选框。

目前我的代码进入了“完成”方法,但它不包含用户刚刚所做的复选框的值(即,如果他们只是选中了该框,它不会将 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

9

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 },
} %>
于 2016-06-18T14:34:57.077 回答
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 回答
4

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

事实证明,添加remote: true到输入会导致 jquery-ujs 以所有不错的方式使其成为 ajax-y。Thoughtbot 的“A Tour of Rails jQuery UJS”简要介绍了这一点(以及许多其他可用的好东西);jQuery UJS wiki 中的“Unobtrusive scripting support for jQuery”页面在这方面也做了彻底的工作。

于 2016-01-07T00:52:17.883 回答
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 回答