views:

100

answers:

1

I have the following (heavily simplified) model, that uses will_paginate

class Search < ActiveRecord::Base

  attr_reader :articles

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

end

and the controller code in my show action is

@search = Search.new(params[:search])

This all works fine, but notice i hard coded the page number to 1, problem is passing params[:page] value into the after_initialize method, can anyone suggest an elegant way to do this please?

Thanks

+2  A: 

Add a page parameter (or even better an options hash parameter) to the initialize method:

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

  def after_initialize
    @articles = Article.paginate_by_name name, :page => @options[:page]
  end
end

and then in your controller:

@search = Search.new(params[:search], :page => params[:page])

You can even supply default values to the option hash, if you like.

Teoulas
As `Search` extends `ActiveRecord::Base` remember to include the call to `super(search)` and to make `search` an optional parameter too i.e. `def initialize(search = {}, options = {})` in order to preserve existing behaviour.
mikej
Thanks for help, all working now. Small gotcha, be sure to put the call to super after assignment of the options, as super will trigger after_initialize callback.
Jon