当我尝试使用params.require(...)时,我遇到了麻烦。允许(...)
在我的申请中,我收到了以下参数:
{"utf8"=>"✓",
"authenticity_token"=>"Vatzcb5tgTu2+wL1t6Of+FbIK8Ibp+tM03Naai4b2OU=",
"/login"=>{"username_or_email"=>"jonatasteixeira",
"password"=>"[FILTERED]"},
"commit"=>"Save /login" }
我想知道为什么我的密钥收到了" / login"名。
我的观点:
<h1>Login</h1>
<%= form_for(login_path) do |f| %>
<div class="field">
<%= f.label :username_or_email %><br>
<%= f.text_field :username_or_email %>
</div>
<div class="field">
<%= f.label :password %><br>
<%= f.password_field :password %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
<%= link_to 'Back', root_path %>
在我的控制器中
class SessionsController < ApplicationController
# GET /login
def new
@user = User.new
end
# POST /login
def create
@user = User.find_by_emai(session_params[:username_or_email]) || User.find_by_username(session_params[:username_or_email])
if @user && @user.authenticate(session_params[:password])
session[:current_user_id] = @user.id
flash[:notice] = 'You are logged in'
else
flash[:notice] = 'Invalid password, username or email'
end
end
private
# Never trust parameters from the scary internet, only allow the white list through.
def session_params
logger.info :login
params.require("/login").permit(:username_or_email, :password)
end
end
我不想使用&#34; / login&#34;作为关键,我想用:登录。有人知道我该如何调整它?
谢谢!
答案 0 :(得分:2)
正如@Rafal所指出的那样,你可以将你的调用编码为form_for
,以摆脱你的参数中的/login
密钥:
<%= form_for(:login) do |f| %>
强参数实际上仅适用于在对象上进行批量赋值的场景。例如,如果您创建用户,那么您可能希望使用强参数将属性传递到new
初始化方法。
@user = User.new(session_params)
但是因为在这种情况下您没有进行批量分配,所以您可以直接传递值而不使用session_params
方法:
# POST /login
def create
@user = User.find_by(email: params[:login][:username_or_email]) || User.find_by(username: params[:login][:username_or_email])
if @user && @user.authenticate(params[:login][:password])
session[:current_user_id] = @user.id
flash[:notice] = 'You are logged in'
else
flash[:notice] = 'Invalid password, username or email'
end
end
强参数的重点是没有人可以传递额外的属性。在/login
方案中,您的代码完全可以控制所处理的值,因此您不必担心它。
答案 1 :(得分:1)
当你使用form_for
时,Rails希望传递object
,以便它可以从中构建各种不同的元素:
[form_for]帮助程序旨在使资源处理更加容易 与使用vanilla HTML相比。
问题是你正在通过这种方法的路线,我很惊讶它实际上是有效的。
-
根据接受的答案推荐使用symbol
或使用不需要对象的form_tag
,您最好使用<%= form_tag login_path do %>
<%= text_field_tag :username_or_email %>
<%= password_field_tag :password %>
<%= submit_button_tag "Go" %>
<% end %>
:
require
这将删除对params的“login”键的引用,并使您能够执行此操作(不需要params.permit(:username_or_email, :password)
):
{{1}}
答案 2 :(得分:0)
而不是
<%= form_for(login_path) do |f| %>
使用
<%= form_for(:login) do |f| %>