Ruby on rails 如何更新Rails中多个模型的at属性?

Ruby on rails 如何更新Rails中多个模型的at属性?,ruby-on-rails,ruby,ajax,Ruby On Rails,Ruby,Ajax,我希望通过单击链接来执行此操作 def index @books = Book.all end def update_read_books @books.each do |book| book.update_attribute(:read, true) end end 如何更新所有书籍并将其标记为已读?Rails有一个update\u all方法 设置路线,为您提供/books/mark\u as\u read resources :books do get

我希望通过单击链接来执行此操作

def index    
   @books = Book.all
end

def update_read_books
  @books.each do |book|
    book.update_attribute(:read, true)
  end
end

如何更新所有书籍并将其标记为已读?

Rails有一个
update\u all
方法

设置路线,为您提供
/books/mark\u as\u read

resources :books do
  get :mark_as_read, on: :collection
end
那么在你看来,

= link_to "Mark all as Read", mark_as_read_books_path
如果您真的想要Restful,可以将路由设置为put/patch方法。别忘了将链接更改为您选择的方法

如果希望这是一个Ajax请求,可以在链接中添加
remote:true

= link_to "Mark all as Read", mark_as_read_books_path, remote: true
这将使它异步。然后,您需要在控制器中处理该响应

def mark_as_read
  Book.update_all(read: true)
  respond_to do |format|
    format.html { redirect_to books_path }
    format.js
  end
end
。。。并在
/views/books/update_all.js.erb
中添加一个模板,并添加一些jQuery以删除通知。例如:

$('#notification_count').hide();

首先,在索引方法之外定义您的方法

def index    
   @books = Book.all  
end 

def update_read_books
    Book.update_all(read: true)
end
定义路线:

resources :books do
  put :update_read_books, on: :collection
end
那么在你看来,

= form_for update_read_books ,:remote => true do |f|
    = f.submit "All Read"

试试这个。希望能有所帮助。

我要阻止的链接基本上是一个下拉菜单(使用引导)。使用这种方法,它将引导我找到mark_as_read_books_路径,但我不希望这样。我只是想点击更新所有读布尔值为真,这有什么问题吗?这正是这个解决方案的作用。更新所有书籍后,您将重定向回
索引。不要试图将更新操作硬塞进索引方法中。这不是个好主意。只需更新书籍,然后重定向回原处、索引处或任何你想要的地方。下拉列表将显示你读过的书籍列表。这是一种不同类型的应用程序&很难解释,但看看stackoverflow的通知下拉列表。你看到了点击它是如何将通知计数重置回0的吗?Jon,索引操作是用来列出事情的。如果你真的想执行更新操作,你需要为你的链接添加一个钩子。添加一个参数,如
链接到“foo”,books\u路径(update\u all:true)
-然后在索引操作中检查该参数是否存在:
如果参数[:update\u all]。是否存在?#执行任务并重定向
。。。但是问问你自己,为什么要这样做,而不是将更新全部移动到自己的操作中呢?Jon,这是使用JavaScript完成的。因此,轮询或查询服务器以查找任何未读通知。然后它会显示一个数字。这与逻辑在哪里无关。仅仅因为页面没有刷新,并不意味着请求没有发出。因此,在内部的某个地方,So收到一个ajax请求,请求说“嘿,这些通知已被读取”。响应可能是一些JS、JSON,甚至只是删除红色通知的回调。无论是否使用JS,代码都保持不变。这取决于你怎么称呼它。哦,真的,控制器会自动呈现JS吗?你不需要为他写每一个字。他应该知道基本知识,他应该为它提供一个视图。我们是来帮助他的,而不是让他复制你的代码。明白了吗?你写的东西会导致另一个错误,让他更加困惑。重点是帮助他理解。这就是为什么我向他解释了需要做什么以及如何做。相反,你决定复制我的答案,通过使其错误或不完整来更新它。我首先理解他想要什么…不像你每15秒编辑一次帖子…每30秒评论一次。
= form_for update_read_books ,:remote => true do |f|
    = f.submit "All Read"