【问题标题】:rails 4 and thoughtbot/clearance - adding fields to the user modelrails 4 和thoughtbot/clearance - 向用户模型添加字段
【发布时间】:2015-03-19 02:34:09
【问题描述】:

我是一个相对新手,所以非常感谢任何帮助。

我正在使用带有 Clearance gem 的 Rails 4.2 进行身份验证。我希望有人可以描述覆盖控制器以在注册表单上包含自定义属性的最佳实践。

我已经阅读了很多不同的建议,其中许多来自不使用 strong_parameters 的以前版本的 rails。

如果有人可以简要介绍我需要覆盖的方法(user_params/user_from_params/etc),我将不胜感激。我可以通过定义一个仅包含@user = User.new 的新“新”方法和使用 .permit 的新“user_params”方法来使事情正常运行,但我担心我在 user_from_params 中绕过的默认代码.

任何关于最佳实践的建议都会很棒!

谢谢

【问题讨论】:

    标签: ruby-on-rails-4 strong-parameters clearance


    【解决方案1】:

    首先,扩展Clearance::UsersController 并覆盖#user_params 以允许新属性:

    # app/controllers/users_controller.rb
    class UsersController < Clearance::UsersController
    
      private
    
      def user_params
        params[:user].permit(:email, :password, :your_custom_attribute)
      end
    end
    

    然后,更新您的路由文件以使用您的新控制器:

    # config/routes.rb
    resources :users, controller: :users, only: :create
    

    【讨论】:

    • 谢谢!这正如您所期望的那样工作。我唯一要添加的是将user_params 设为private 方法。
    • @psparrow 这不会导致您的new 操作出现问题吗?很确定您还需要覆盖 newuser_from_params...
    • 你也需要路由到#new,否则你会得到一个ActiveModel::UnknownAttributeError。该行应为:resources :users, controller: :users, only: [:new, :create]
    【解决方案2】:

    当我有时间更新 Clearance 文档时,我正在工作,但现在最简单的事情是检查 Clearance users controller 以查看可以覆盖的各种方法。

    user_from_params 的默认实现现在有点奇怪,因为 Clearance 1.x 仍然支持 Rails 3.x,所以它是在我们使用 attr_accessible 而不是强参数的时候编写的。

    我可能会这样做:

    def user_params
      # Use strong params to do what you need
    end
    
    def user_from_params
      User.new(user_params)
    end
    

    您可能需要稍微按摩一下user_params,以便您在那里所做的任何事情对new 操作仍然有效,因为在那里仍然使用user_from_params。我已经打开了issue in Clearance,看看我们是否可以在 2.0 之前改进这方面。

    【讨论】:

    • 非常感谢您的及时回复,非常感谢!
    • 你可以通过只覆盖一种方法来做到这一点(见下文!)
    猜你喜欢
    • 2013-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-12
    • 1970-01-01
    • 2016-09-26
    相关资源
    最近更新 更多