【问题标题】:Multiple require & permit strong parameters rails 4多个需要并允许强参数 rails 4
【发布时间】:2015-12-13 07:54:13
【问题描述】:

在以下情况下,我正在尝试使用强参数。我想要求 email_address, password 并允许 remember_me 字段。

但是像下面这样使用它只允许 LAST line 在方法 Ex:- 在下面的情况下它只需要 params.permit(:remember_me)

  private

  def registration_params
    params.require(:email_address)
    params.require(:password)
    params.permit(:remember_me)
  end

另一个例子:- 在下面这种情况下,如果我像下面这样重新排列它,只需要params.require(:email_address) 我哪里出错了?

  def registration_params
    params.require(:password)
    params.permit(:remember_me)
    params.require(:email_address)
  end

更新 参数哈希就像

{
              "utf8" => "✓",
     "email_address" => "test1@gmail.com",
          "password" => "password123",
       "remember_me" => "true",
            "commit" => "Log in",
        "controller" => "registration",
            "action" => "sign_in"
}

【问题讨论】:

  • 您能给我们看一下您的注册表吗?您似乎没有正确设置表单以使用强参数。

标签: ruby-on-rails ruby ruby-on-rails-4 model-view-controller strong-parameters


【解决方案1】:

好的,通过朋友找到了答案...一种方法是

params.require(:email_address)
params.require(:password)
params.permit(
:email_address,
:password,
:remember_me
)

效果很好。

【讨论】:

    【解决方案2】:

    Song 参数用于防止对 Active Record 模型进行大规模分配。您的参数应以模型支持的形式设置。来自Michael Hartl Tutorial 的示例:

    注册表

    <%= form_for(@user) do |f| %>
      <%= f.label :name %>
      <%= f.text_field :name %>
    
      <%= f.label :email %>
      <%= f.email_field :email %>
    
      <%= f.label :password %>
      <%= f.password_field :password %>
    
      <%= f.label :password_confirmation, "Confirmation" %>
      <%= f.password_field :password_confirmation %>
    
      <%= f.submit "Create my account", class: "btn btn-primary" %>
    <% end %>
    

    这将创建一个如下所示的参数:

    参数

    {
              "utf8" => "✓",
     "user" =>  { email: "test1@gmail.com", name:"Test Name", password: "password", password_confirmation: "password" },
       "remember_me" => "true",
            "commit" => "Log in",
        "controller" => "registration",
            "action" => "sign_in"
    }
    

    然后在您的注册控制器中,您可以使用以下强参数:

    强大的参数

    params.require(:user).permit(:name, :email, :password, :password_confirmation)
    

    在您的情况下,您正在处理登录,在这种情况下,您只需要使用常规参数来捕获登录信息。

    会话创建

    def sign_in
       email = params[:email]
       password = params[:password]
       if User.authenticate!(email, password)
         # do something
       else 
         # do something different
       end
    end
    

    【讨论】:

      【解决方案3】:

      编辑:

      这是 Rails 处理登录的方式,我相信,在这些情况下,您需要“要求”多个参数并将错误返回给用户。

      与使用强参数不同,这种方法在参数缺失或空白时向用户提供反馈(使用验证错误)。这比抛出异常更加用户友好。

      1. 创建一个ActiveModel不是ActiveRecord)表单支持对象。此表单支持对象是您指定需要哪些字段的地方,并且在执行对 valid? 的调用时,将验证这些字段。

        有了这个,如果出现以下情况,您将得到很好的用户友好错误:

        • 电子邮件丢失
        • 密码丢失
        • 邮箱和密码不匹配

        models/session.rb

        class Session
          include ActiveModel::Model
        
          attr_accessor :password, :email, :remember_me
        
          validates_presence_of :password, :email        # these fields are required!
        
          def authenticate
            return false unless valid?   # this checks that required params
                                         # are present and adds errors to the
                                         # errors object if not
        
            if User.authenticate(:password, :email)  # validate credentials
              true
            else              
              errors.add(:email, "and password didn't match")  # wrong credentials. add error!
              false
            end
          end
        end
        
      2. 创建控制器。这是您的控制器在登录用户时的样子:

        app/controllers/sessions_controller.rb

        class SessionsController < ApplicationController
          # GET /login
          def new
            @session = Session.new
          end
        
          # POST /login
          def create
            @session = Session.new(login_params)
            if @session.authenticate
              # do whatever you need to do to log the user in
              # set remember_me cookie, etc.
              redirect_to '/success', notice: 'You are logged in'
            else
              render :new   # shows the form again, filled-in and with errors
            end
          end
        
          private
        
          def login_params
            params.require(:session).permit(:email, :password, :remember_me)
          end
        end
        
      3. 设置视图

        app/views/sessions/new.html.erb

        <% if @session.errors.any? %>
          <ul>
            <% @session.errors.full_messages.each do |msg| %>
              <li><%= msg %></li>
            <% end %>
          </ul>
        <% end %>
        
        <%= form_for @session, :url => login_path do |f| %>
            <div>
              <%= f.label :email, 'Email:' %>
            </div>
            <div>
              <%= f.text_field :email %>
            </div>
            <div>
              <%= f.label :password, 'Password:' %>
            </div>
            <div>
              <%= f.password_field :password %>
            </div>
            <div>
              <%= f.label :remember_me, 'Remember Me?' %>
              <%= f.check_box :remember_me %>
            </div>
            <div>
              <%= f.submit %>
            </div>
        <% end %>
        
      4. 最后,确保路由已配置

        config/routes.rb

        get 'login' => 'sessions#new'
        post 'login' => 'sessions#create'
        

      【讨论】:

      • 我不认为我们可以像那样使用多个require ..无论如何它说ArgumentError (wrong number of arguments (2 for 1)) 如果它以你的方式尝试
      • 我试过了..现在它说NoMethodError (undefined method permit' for "password123$":String)`
      • 看起来不像我想的那样强大的参数工作:/对不起。你能发布你的参数哈希吗?
      • 所以在进一步阅读之后,这可能不是 Rails 的方式来做你想做的事情。您是否使用批量分配所需的参数? (即,将它们传递给 .new、.create、.update 调用?)。还是您只是在数据库中查找用户?
      • 换句话说:您是登录用户还是注册用户?
      【解决方案4】:

      2020 年解决方案:

      def registration_params
        params.require([:email_address, :password])               #require all of these
        params.permit(:email_address, :password, :remember_me)    #return hash
      end
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-12-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-17
        相关资源
        最近更新 更多