多个 require 和 permit 强参数 rails 4

Multiple require & permit strong parameters rails 4

在下面的例子中,我尝试使用强参数。我想要求 email_address, password 并允许 remember_me 字段。

但是像下面这样使用它只允许方法中的最后一行 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"
}

编辑:

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

与使用强参数不同,此方法在参数缺失或为空时向用户提供反馈(使用验证错误)。这比抛出异常更人性化。

  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'
    

Stong 参数是为了防止对 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

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

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

效果不错。

2020 年解决方案:

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