0

我想通过单击链接来执行此操作。

def index    
   @books = Book.all
end

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

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

4

2 回答 2

0

Rails 有一个update_all方法。见链接

def mark_as_read
  Book.update_all(read: true)
  redirect_to books_path
end

设置路线给你/books/mark_as_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();
于 2013-07-23T16:38:34.217 回答
0

首先在索引方法之外定义你的方法。

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"

试试这个。希望它会有所帮助。

于 2013-07-23T16:52:03.693 回答