首先,我不知道这是否是程序员设计选择,或者是否存在针对此场景的“已接受练习”。
我想创建一个用户个人资料控制器,并让它可以“公开”访问: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'等的公认惯例是什么
答案 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
字段username
或user handle
: yoururl.com/jacob/profile
强>
重要的事我忘了提及;
你想让你的users
控制器保持苗条的原因是因为Rails如何工作 - OOP。
面向对象编程意味着您所做的一切都应围绕对象展开。这是中级/高级开发人员的常见做法;由于Ruby是OOP,Rails基于它。
Rails的工作方式(并且,不,你不需要知道这一点,但它肯定有帮助)是通过一个名为MVC的编程模式:
对于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
条件。