如何根据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>
答案 0 :(得分:3)
你不会。您将定义两个范围pending
和approved
,并根据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])