根据参数更改范围

时间:2013-06-14 16:23:17

标签: ruby-on-rails ruby ruby-on-rails-3

如何根据URI中的参数动态更改链上的范围?

例如:

http://www.example.com/object?status=approved

会导致ObjectController#index

def index
  @objects = Object.approved.<other-chains>
end

如果statuspending,则控制器方法类似于:

@objects = Object.pending.<other-chains>

2 个答案:

答案 0 :(得分:3)

你不会。您将定义两个范围pendingapproved,并根据URL有条件地调用它们。你不能(或者至少不应该)在运行时动态地改变你的范围,或者你将打破后续请求。

如果你想避免分支if / elses,你可以在确定它是在预先批准的可接受方法列表之后send模型的方法:

class MyController

  def index
    @objects = Object.send(scope).chain.chain.chain
  end

protected

  # return "pending", "approved", or "scoped", 
  #   so that Object.send(scope) *always* works, and returns a chainable relation
  def scope
    scopes = %w(pending approved)
    scopes.include?(params[:status].to_s) ? params[:status] : "scoped"
  end

end

默认为"scoped",确保调用的方法将返回一个可以链接其他方法的关系。

答案 1 :(得分:0)

怎么样:

@objects = Object.send(params[:status])