我正在为所有50个州的用户建立一个网站。我们需要为每个用户显示特定于他们的情况的信息,例如他们在该状态下完成的事件的数量。每个州的视图(部分)显示特定于州的信息,因此依赖于特定于州的模型中的特定状态计算。我们想做类似的事情:
@#{user.state} =#{user.state.capitalize} .new(current_user)
在users_controller而不是中的
@illinois = Illinois.new(current_user) if (@user.state == 'illinois')
.... [and the remaining 49 states]
@wisconsin = Wisconsin.new(current_user) if (@user.state == 'wisconsin')
触发Illinois.rb模型,然后通过
驱动users_controller中定义的视图def user_state_view
@user = current_user
@events = Event.all
@illinois = Illinois.new(current_user) if (@user.state == 'illinois')
end
我正在努力寻找更好的方法来做/重构它。谢谢!
答案 0 :(得分:0)
如果你能提供帮助,我会避免动态定义实例变量。可以使用instance_variable_set
来完成,但这是不必要的。您没有理由将变量定义为@illinois
而不仅仅是@user_state
或类似的东西。这是一种方法。
首先制作静态状态列表:
def states
%{wisconsin arkansas new_york etc}
end
然后创建一个字典,将这些状态映射到他们的类:
def state_classes
states.reduce({}) do |memo, state|
memo[state] = state.camelize.constantize
memo
end
end
# = { 'illinois' => Illinois, 'wisconsin' => Wisconsin, 'new_york' => NewYork, etc }
在某处对状态标识符列表进行硬编码非常重要,因为将任意值传递给contantize
并不是一个好习惯。
然后实例化正确的类是轻而易举的:
@user_state = state_classes[@user.state].new(current_user)
肯定有其他方法可以做到这一点(例如,它可以在模型层上添加)