rails params是如何创建的?

时间:2014-07-06 01:02:21

标签: ruby-on-rails ruby-on-rails-4 params ruby-on-rails-4.1

当我尝试使用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;作为关键,我想用:登录。有人知道我该如何调整它?

谢谢!

3 个答案:

答案 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

当你使用form_for时,Rails希望传递object,以便它可以从中构建各种不同的元素:

  

[form_for]帮助程序旨在使资源处理更加容易   与使用vanilla HTML相比。

问题是你正在通过这种方法的路线,我很惊讶它实际上是有效的。

-

form_tag

根据接受的答案推荐使用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| %>