处理用户特定视图的更好方法?

时间:2013-12-04 16:19:52

标签: ruby-on-rails ruby oop dry

我正在开发我的第一个RoR应用程序并发现自己一遍又一遍地重新键入一些相同的代码......当然我做错了!我的应用程序有两种不同的用户类型(投资者和企业家),我经常发现自己在我的控制器中写这个:

def index
  if current_user.user_type == "investor"
    render "investor"
  else
    render "entrepreneur"
  end
end

然后我对我的投资者有一个看法,对我的企业家有一个单独的看法。虽然这有效,但我知道有更好的方法!有人可以赐教我吗?

2 个答案:

答案 0 :(得分:0)

使其成为应用程序控制器中的辅助方法。

def user_role
  current_user.user_type  
end
helper_method :user_role

此方法将返回“投资者”或“企业家” 通过制作辅助方法,您可以在控制器,助手,视图中随处使用它。

答案 1 :(得分:0)

如果您需要跨多个控制器,那么只需在application_controller.rb中创建一个新方法

您可以在application_controller.rb

中定义这样的方法
def user_type?(user)
  return user.user_type.to_s
end

并切换您的控制器方法以便将其用作

def index
    render user_type?(current_user)
end

但就此而言;如果你的用例很简单,为什么不直接在你的控制器方法中这样做?

def index
  render current_user.user_type.to_s
end

编辑以回答后续问题


如果您查看Rails指南http://guides.rubyonrails.org/layouts_and_rendering.html“在运行时选择布局”部分,他们几乎可以按照此处概述的相同方式处理此问题。

如果不同的用户类型看到2个真正不同的页面,那么这就是要走的路;保持控制器或application_controller中的逻辑。

但是,如果您的两种用户类型看到的内容完全相同,但差异很小,或者页面的特定部分,那么无论用户类型如何,您都可能希望始终呈现相同的视图。然后,您可以检查然后组成多个部分的视图,以根据用户引入正确的部分。您的“逻辑代码”应尽可能远离视图,因此在这种情况下,您可能希望将此与位于/ app / helpers的辅助方法相结合。 /app/helpers/application_helper.rb中定义的方法可供所有视图使用。您还可以在/app/helpers/controller_name_helper.rb中创建特定于控制器的视图助手方法