【问题标题】:Rails: How to treat some fields of model info independently? Eg. Account vs. Profile informationRails:如何独立处理模型信息的某些字段?例如。帐户与个人资料信息
【发布时间】:2011-01-20 06:59:31
【问题描述】:

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

例如,我想在 Profile 页面或选项卡上编辑 NameBioLocation,并在 loginemailpassword 上进行编辑在Account 页面或标签上。

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

提前感谢您提出的任何想法。

【问题讨论】:

    标签: ruby-on-rails model user-profile


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      型号:

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

      【讨论】:

      • 谢谢。我将尝试您和 klew 的方法,并且应该很快接受我认为最适合我的方法。
      【解决方案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 =&gt; {:foo =&gt; 'bar'} 传递它,然后它将在控制器中作为params[:foo] 使用,但它似乎不适用于resources。那么如何区分帐户和个人资料呢?您可以从当前 url (here is example) 读取它。然后在控制器中,您可以根据请求的资源呈现不同的视图。

      【讨论】:

      • 无论如何我都不是 Rails 专家,但我不明白为什么它可能会添加一些 sql 查询。如果有一些视图只显示个人资料信息,是否会减少查询?
      • @ghoppe:当他有一个模型时,肯定只会查询一次。当他有两个表并加载@user = User.find(params[:id]) 然后他使用@user.profile.login 时,它将进行第二次查询。我不是 sql 专家,但我认为如果我们肯定会同时使用它们并加入它们,那么拥有一个具有更多列的表比两个具有更少列的表更好。
      • 感谢您的详尽回答。我将尝试您和 ghoppe 的方法,并且应该很快接受我认为最适合我的方法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-12
      • 2016-08-24
      • 2019-05-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多