【问题标题】:Rails change boolean value with checkbox and jquery ajaxRails 使用复选框和 jquery ajax 更改布尔值
【发布时间】:2013-03-22 14:08:11
【问题描述】:

我是 Rails 新手,我试图通过复选框和使用 jquery ajax 来更改布尔值:

<%- @tasks.each do |task| %>
  <div class="task-wrapper">
    <%= check_box_tag 'completed', task.id , task.completed, :class => "task-check" %>
    <%= content_tag :span, task.task %>
    <%= content_tag :span, task.deadline %>
  </div>
<% end %>

和javascript:

$(".task-check").bind('change', function(){
  if (this.checked){
    var bool = this.checked ? 1 : 0;
    $.ajax({
      url: '/todos/toggle',
      type: 'POST',
      data: '{"task_id":"'+ this.value +'", "bool":"'+ bool +'"}'
    });
  }
  else {
    alert("no");
  }
});

然后是控制器:

def toggle(task_id, bool)
  @task = Todo.find_by_id(task_id)

  if @task != nil?
    @task.update_attributes(:completed => bool)
  else
    set_flash "Error, please try again"
  end
end

最后是路线:

resources :todos do
  member do
    post 'toggle'
  end
end

也尝试过收集,但给出了同样的错误。

每当我尝试它时,我都会在操作中收到 404 error

有什么问题?

谢谢

【问题讨论】:

  • 您的任务循环是否在表单内?
  • @Catfish - 不在表格之外
  • 你为什么不把它放在一个表格里呢?会简单很多。然后你可以使用f.check_box,而不是check_box_tag
  • @Catfish - 但是我如何在没有回发的情况下更改bool

标签: ruby-on-rails jquery routes boolean


【解决方案1】:

从 Rails 4 开始,有一种方法可以做到这一点,而无需任何额外的 JS 或 CSS:

<%= check_box_tag 'completed', task.id, task.completed,
      data: {
        remote: true,
        url: url_for(action: :toggle, id: task.id),
        method: "POST"
      } %>

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

【讨论】:

  • 也可用于早期版本的 rails,不确定哪些,但 3 的最后一个版本有效。
  • 仍在为 rails 5.1.6 和 5.2 工作。这是这里最好的遮阳篷。
【解决方案2】:

尝试以下方法(其他一切保持原样):

javascript:

$(".task-check").bind('change', function(){
  if (this.checked){
    $.ajax({
      url: '/todos/'+this.value+'/toggle',
      type: 'POST',
      data: {"completed": this.checked}
    });
  }
  else {
     alert("no");
  }
});

控制器:

def toggle
  @task = Todo.find(params[:id])

  if @task.update_attributes(:completed => params[:completed])
    # ... update successful
  else
    # ... update failed
  end
end

查看bundle exec rake routes,向您展示rails 生成的路径。如果您的 post 'toggle' 是成员,您将获得类似 /todos/:id/toggle 的路径,因此在 ajax 中更新了 url。

在控制器中,路径中的:idparams[:id] 结尾。来自 ajax 请求的数据也以 params 散列结束,因此是 params[:completed]

【讨论】:

  • 这很好用,你能解释一下为什么会这样吗?谢谢
  • 请注意,Rails 4 添加了一种更简单的方法,如下所述
猜你喜欢
  • 2011-12-17
  • 1970-01-01
  • 2012-11-28
  • 2016-01-21
  • 2011-06-17
  • 2012-04-06
  • 2012-05-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多