2

我有一个包含常用信息(登录名、电子邮件、姓名、位置等)的用户模型。但是,当用户决定编辑他们的信息时,我想根据适当的关注点分开要编辑的字段。

例如,我想在页面或选项卡上编辑,NameBio在页面或选项卡上编辑,和。LocationProfileloginemailpasswordAccount

实现这一目标的最佳实践和最安全的方法是什么?我应该有两个单独的模型/资源:用户和用户配置文件吗?或者我可以在 中创建类似profile方法的东西UserController,使用只有特定配置文件字段的自定义表单,并在用户页面中链接到它?我真的很困惑如何去做。

提前感谢您可能有的任何想法。

4

3 回答 3

3

如果您的所有用户都有个人资料和帐户字段,那么我不会将它放在单独的模型中。它只会为您的表单添加不必要的复杂性,并且可能会添加一些 sql 查询。

我在这里看不到任何安全问题。在编辑的情况下,两个操作(编辑帐户和个人资料)应该以相同的方式受到保护 - 因此只有所有者用户应该能够编辑它们。如果他想在编辑他的名字时“破解”它并编辑他的登录名,那么这是他的问题。这不会造成任何问题,因为他被允许编辑这两个字段。

根据其他人可以查看的视图:只是不要在那里显示任何属于帐户部分的字段。

怎么分开?对我来说,最干净的方法是添加这种路线:

map.resources :accounts
map.resources :profiles

/accounts/34/edit并使用诸如编辑帐户部分和/profiles/34/edit编辑个人资料部分之类的路径。

在这种情况下,您将需要一个单独的控制器用于两条路线:accounts_controller.rbprofiles_controller.rb. 如果他们共享许多相似的方法和行为,您可以将其添加users_controller.rb到配置文件和帐户控制器中,并从它继承。

您也可以使用一个控制器来执行此操作:

map.resources :accounts, :controller => 'users'
map.resources :profiles, :controller => 'users'

但我不知道如何通过使用创建的路由传递一些附加值resources。当您使用时,connect您可以通过它,:defaults => {:foo => 'bar'}然后它将在控制器中可用,params[:foo]但它似乎不适用于resources. 那么如何区分帐户和个人资料呢?您可以从当前 url 读取它(这里是示例)。然后在控制器中,您可以根据请求的资源呈现不同的视图。

于 2010-02-23T23:15:28.390 回答
3

我认为这取决于您的应用程序的其余部分。听起来在您的情况下,模块化很好。如果您希望用户能够看到其他用户的个人资料,则为个人资料拥有一个单独的模型并通过 has_one 关系喜欢它是一个优势。我只是调用该类Profile,以便可以user.profile在您的控制器和视图中访问它。

楷模:

class User < ActiveRecord::Base
  has_one :profile, :dependent => :destroy
end

class Profile < ActiveRecord::Base
  belongs_to :user
end
于 2010-02-23T22:44:14.517 回答
1

我会倾向于在这里沿着谷物切割。将模型映射到表单会更容易。因此,如果您在 UI 的不同表单中访问信息,我将为每个表单创建一个模型。

也就是说,在我的系统中的某个时刻,我倾向于从基本 User 类中提取配置文件信息,因此 User 仅用于身份验证。

于 2010-02-23T22:11:10.603 回答