如何根据 URI 中的参数动态更改链上的范围?
例如:
http://www.example.com/object?status=approved
会导致ObjectController#index
:
def index
@objects = Object.approved.<other-chains>
end
如果status
是pending
,控制器方法将类似于:
@objects = Object.pending.<other-chains>
如何根据 URI 中的参数动态更改链上的范围?
例如:
http://www.example.com/object?status=approved
会导致ObjectController#index
:
def index
@objects = Object.approved.<other-chains>
end
如果status
是pending
,控制器方法将类似于:
@objects = Object.pending.<other-chains>
你不会的。您将定义两个范围pending
和approved
,并根据 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",您确保调用的方法将返回一个关系,其他方法可以链接到该关系上。
怎么样:
@objects = Object.send(params[:status])