Rails的check_box_tag如何ajaxily检查时,通过价值(Rails check_b

2019-08-18 04:49发布

在我的工作模式我的索引页,我想,以显示对应于布尔字段“完整”在我的任务数据库表中的每一行的复选框。

目前,我的代码进入方法“完成”,但它不包含此复选框,用户只是做的值(即如果他们只是检查了盒子,它并不真正传递给我的“完整”的方法)。

我怎样才能传递用户刚刚进行的价值 - 无论是检查或取消检查?

/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 %>

器/控制器/ 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

Answer 1:

如果您在使用jQuery,你可以写一个click事件。

$('.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 }
   });     
});


Answer 2:

从这个问题中轨的建议/ jQuery的UJS GitHub库工作对我来说: 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 },
} %>


Answer 3:

由于轨道4,你应该能够抛弃一切从原来的答复的JS。 在你的问题中的代码应该只是工作,由于jQuery的UJS魔法。

事实证明,加入remote: true到输入导致jQuery的UJS使其阿贾克斯-γ的一切好办法。 Thoughtbot的“一个Rails之旅的jQuery UJS”简要介绍了这一点(和其他很多东西可用); 在“不显眼的脚本支持jQuery的”页中的jQuery UJS维基做一个彻底的工作在这一点。



Answer 4:

check_box_tag 'complete', task.complete ? 'false' : 'true', task.complete, ...
:url => url_for( :action => 'complete', :id => task.id )

这样,在你的控制器,你可以得到PARAMS [:完整。 你应该实现complete.js.erb重新呈现复选框,这样下次点击将发送倒数

或者你也可以实现在点击事件的js

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

不要忘了数据后ID PARAM向您的复选框



文章来源: Rails check_box_tag how to pass value when checked ajaxily