[英]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 方式,我相信,在您需要“要求”多個參數並將錯誤返回給用戶的情況下。
與使用強參數不同,這種方法在參數缺失或空白時向用戶提供反饋(使用驗證錯誤)。 這比拋出異常更加用戶友好。
創建一個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
創建控制器。 以下是您的控制器用於登錄用戶的樣子:
應用程序/控制器/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
設置視圖
應用程序/視圖/會話/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 %>
最后,確保配置了路由
配置/路由.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.