0

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

例如:

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

会导致ObjectController#index

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

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

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

4

2 回答 2

3

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

如果你想避免分支 if/else,你可以只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",您确保调用的方法将返回一个关系,其他方法可以链接到该关系上。

于 2013-06-14T16:30:56.050 回答
-1

怎么样:

@objects = Object.send(params[:status])
于 2013-06-14T16:29:07.017 回答