如何为同一资源设置单数和复数路由?

时间:2015-09-27 09:45:08

标签: ruby-on-rails

首先,我不知道这是否是程序员设计选择,或者是否存在针对此场景的“已接受练习”。

我想创建一个用户个人资料控制器,并让它可以“公开”访问:Private Sub test() Call code MsgBox ("Hello") End Sub Private Sub code() If Condition = False Then End If MsgBox ("Hello World") End Sub 和经过身份验证的会话用户,例如:/users/[user_id/user_name]/profile

我也不知道命名这个控制器,'Users :: Passwords','Users :: Password','User :: Password'等的公认惯例是什么

2 个答案:

答案 0 :(得分:0)

  

用户个人资料控制器

别。

个人资料通常由users控制器生成:

  • users/edit =“个人资料编辑”
  • users/show =“个人资料视图”

这意味着您应该能够使用单个profiles控制器,而不是使用单独的users控制器:

#config/routes.rb
resources :users, path: "", only: [:show], path_names: { show: 'profile' } do
    get "user/profile", action: :edit
    match "user/profile", action: :update, via: [:put, :patch]
end


#app/controllers/users_controller.rb
class UsersController < ApplicationController
   before_action: :authenticate_user!, only: [:edit, :update]

   def edit
      @user = current_user
   end

   def update
      @user = current_user
   end

   def show
      @user = User.find params[:id]
   end
end

这将为您提供以下路线:

  • yoururl.com/:id/profile #-> users/show (show profile)
  • yoururl.com/user/profile #-> users/edit (edit profile)

如果您之后使用friendly_id等宝石来填充:id字段usernameuser handle yoururl.com/jacob/profile

重要的事我忘了提及;

你想让你的users控制器保持苗条的原因是因为Rails如何工作 - OOP

面向对象编程意味着您所做的一切都应围绕对象展开。这是中级/高级开发人员的常见做法;由于Ruby是OOP,Rails基于它。

Rails的工作方式(并且,不,你不需要知道这一点,但它肯定有帮助)是通过一个名为MVC的编程模式:

enter image description here

对于Rails,您的模型构建应用程序运行所需的对象。这一点很重要,因为当您终于明白,您对应用程序所做的一切都必须启动以及您希望与之交互的对象,从控制器到您的< em> views 落实到位。

因此,当您询问是否应该拥有“用户配置文件控制器”时,答案来自您是否拥有用户配置文件对象。如果没有,那么你不需要控制器。

users控制器就足够了,授予您使用方法的正确结构。

答案 1 :(得分:0)

你要求接受一种习惯,这是一种品味问题。 (并且还取决于上下文。拥有数百名开发人员的公司只需要更多规则,其中一些规则在与少数或者没有其他开发人员合作时没有任何意义。)因此在Stack Overflow上很难回答。

对我来说,这些用例通常是截然不同的:1。当用户要求她自己的个人资料并进行编辑时。 2.当用户查看来自不同用户的个人资料时,或者管理员编辑用户的用户数据。我呈现不同的字段和不同的页面(用户可以更改自己的密码)。因此,即使它们访问相同的模型对象,它们在概念上通常也是不同的。

幸运的是,没有人强迫我们在模型和控制器之间建立1:1的关系。 MVC模式甚至鼓励我们为模型配备许多控制器。 当你有一个1:1的控制器 - 模型关系时,Rails以资源为导向的风格会让事情变得更容易,比如做一个link_to @user.name, @user。我认为面向资源的风格有时适用于严格。重要的是用户,用户界面永远不应该取决于模型的实现细节。

我通常为这些用例使用两个不同的控制器,仅为自己的数据使用配置文件控制器,为其他用户的数据使用用户控制器。控制器有自己的看法。如果我想分享部分演示文稿,我可以使用部分内容。访问安全性是隐含的,用户没有机会查看私人数据或操纵其他用户的密码。是的,它复制了一些代码。另一方面,我在任何地方都不需要if current_user == @user条件。