如何更新Rails中多个模型的属性?

时间:2013-07-23 16:36:39

标签: 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

如何将所有图书标记为已阅读?

2 个答案:

答案 0 :(得分:0)

Rails有update_all方法。 See link

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();

答案 1 :(得分: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"

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