将变量传递给模型after_initialize方法

dan*_*ave 3 ruby search model ruby-on-rails will-paginate

我有以下(大大简化)模型,使用will_paginate

class Search < ActiveRecord::Base

  attr_reader :articles

  def after_initialize
    @articles = Article.paginate_by_name name, :page => 1
  end

end
Run Code Online (Sandbox Code Playgroud)

我的show动作中的控制器代码是

@search = Search.new(params[:search])
Run Code Online (Sandbox Code Playgroud)

这一切都很好,但是请注意我将页码硬编码为1,问题是将params [:page]值传递给after_initialize方法,有人能建议一个优雅的方法吗?

谢谢

Teo*_*las 6

在initialize方法中添加页面参数(甚至更好的选项哈希参数):

class Search
  def initialize(search, options = {})
    @options = options
  end

  def after_initialize
    @articles = Article.paginate_by_name name, :page => @options[:page]
  end
end
Run Code Online (Sandbox Code Playgroud)

然后在你的控制器中:

@search = Search.new(params[:search], :page => params[:page])
Run Code Online (Sandbox Code Playgroud)

如果愿意,您甚至可以为选项哈希提供默认值.

  • 当`Search`扩展`ActiveRecord :: Base`时,记得要包含对`super(search)`的调用,并使``search`也是一个可选参数,即`def initialize(search = {},options = {})`in为了保护现有的行为. (7认同)
  • 感谢您的帮助,现在都在工作.小问题,确保在分配选项后将调用置于超级,因为super将触发after_initialize回调. (2认同)