Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 处理用户特定视图的更好方法?_Ruby On Rails_Ruby_Oop_Dry - Fatal编程技术网

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

Ruby on rails 处理用户特定视图的更好方法?,ruby-on-rails,ruby,oop,dry,Ruby On Rails,Ruby,Oop,Dry,我正在开发我的第一个RoR应用程序,我发现自己一遍又一遍地重新键入一些相同的代码。。。我肯定做错了什么!我的应用程序有两种不同的用户类型:投资者和企业家,我经常在我的控制器中写下这句话: def index if current_user.user_type == "investor" render "investor" else render "entrepreneur" end end 然后,我对我的投资者有一个看法,对我的企业家有一个单独的看法。虽然这样做有效

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

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

然后,我对我的投资者有一个看法,对我的企业家有一个单独的看法。虽然这样做有效,但我知道还有更好的方法!有人能告诉我吗?

让它成为应用程序控制器中的助手方法

def user_role
  current_user.user_type  
end
helper_method :user_role
这种方法将回报投资者或企业家
通过创建helper方法,您可以在控制器、helper、视图中的任何位置使用它。

如果您需要跨多个控制器使用它,那么只需在application\u controller.rb中创建一个新方法即可

def user_type?(user)
  return user.user_type.to_s
end
您可以在应用程序_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指南中的“在运行时选择布局”一节,就会发现它们的处理方式与这里介绍的方式基本相同

如果不同的用户类型看到的是2个真正不同的页面,那么这就是方法;将逻辑保留在控制器或应用程序控制器中


但是,如果两种用户类型看到的内容基本相同,但差异很小,或者页面的某个特定部分,那么无论用户类型如何,您都可能希望始终呈现相同的视图。然后,您可以检查并组合多个部分的视图,以根据用户的不同引入正确的部分。您的逻辑代码应该尽可能远离视图,因此在本例中,您希望将其与位于/app/helpers的helper方法结合使用。在/app/helpers/application_helper.rb中定义的方法将可用于所有视图。您还可以在/app/helpers/controller\u name\u helper.rb

Hm中创建特定于控制器的视图帮助器方法,为什么不在ApplicationController中编写它呢?喜欢第二个示例的简单性!我想知道的另一件事是,我是否应该使用一种完全不同的方法来呈现特定于用户的视图-也许有一个我不知道的gem可以处理这类事情?我在上面的回答中添加了一些关于您后续问题的附加信息,因为它太长,无法包含在评论中。希望能有帮助。