控制器

时间:2018-03-07 17:56:08

标签: ruby ruby-on-rails-3

我正在为所有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

我正在努力寻找更好的方法来做/重构它。谢谢!

1 个答案:

答案 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)

肯定有其他方法可以做到这一点(例如,它可以在模型层上添加)