簡體   English   中英

多個要求和允許強參數 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

UPDATE Params hash 就像

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

好的,通過朋友找到了答案……一種方法是

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

效果很好。

編輯:

這是您處理登錄的 Rails 方式,我相信,在您需要“要求”多個參數並將錯誤返回給用戶的情況下。

與使用強參數不同,這種方法在參數缺失或空白時向用戶提供反饋(使用驗證錯誤)。 這比拋出異常更加用戶友好。

  1. 創建一個ActiveModel不是ActiveRecord )表單支持對象。 您可以在此表單支持對象中指定哪些字段是必需的以及何時調用valid? 執行,這些字段將被驗證。

    有了這個,你會得到很好的用戶友好的錯誤,如果:

    • 電子郵件丟失
    • 密碼丟失
    • 電子郵件地址和密碼不匹配

    模型/會話.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. 創建控制器。 以下是您的控制器用於登錄用戶的樣子:

    應用程序/控制器/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. 設置視圖

    應用程序/視圖/會話/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. 最后,確保配置了路由

    配置/路由.rb

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

強參數是為了防止大量分配給 Active Record 模型。 您的參數應該以模型支持的形式設置。 Michael Hartl 教程中的示例

報名表格

<%= 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

2020年解決方案:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM