【问题标题】:Unpermitted Parameters in RailsRails 中不允许的参数
【发布时间】:2016-01-18 21:53:24
【问题描述】:

我为我的站点创建了一个注册表单,并在我的 users_controller.rb 文件中包含了以下参数,以便将输入到相应字段中的数据保存到我的数据库中。出于某种原因,当我尝试提交我创建的注册表单时,控制台告诉我名字和姓氏是不允许的参数。错误是:

不允许的参数:名字,姓氏

注册成功,其他参数输入数据库就好了;但是 firstname 和 lastname 列保持为空。

users_controller.rb

   class UsersController < ApplicationController

def create
  @user = User.new(user_params)
  if @user.save
    flash[:success] = "You signed up successfully"
    flash[:color] = "valid"
    redirect_to @user
  else
    flash[:notice] = "Form is invalid"
    flash[:color] = "invalid"
    render "new"
  end
end

private
def user_params
  params.require(:user).permit(:firstname, :lastname, :email, :password, :password_confirmation)
end


def show
  @user = User.find(params[:id])
end

def new
end

end

new.html.erb

<%= form_for(:user, :url => {:controller => 'users', :action => 'create'}) do |f| %>

    </br> <%= f.text_field :firstname, placeholder: 'First Name' %> 
    </br> <%= f.text_field :lastname, placeholder: 'Last Name' %>
    </br> <%= f.text_field :email, placeholder: 'Email' %> 
    </br> <%= f.password_field :password, placeholder: 'Password' %>
    </br> <%= f.password_field :password_confirmation, placeholder: 'Confirm Password' %>


    <%= f.submit :Register %>
  <% end %>

schema.rb

create_table "users", force: :cascade do |t|
    t.string   "firstname"
    t.string   "lastname"
    t.string   "email"
    t.datetime "created_at",      null: false
    t.datetime "updated_at",      null: false
    t.string   "password_digest"
    t.string   "password"
  end

user.rb

class User < ActiveRecord::Base

    has_secure_password

  validates_length_of :password, :in => 6..20, :on => :create
  validates :password_confirmation, presence: true, if: -> { new_record? || changes["password"] }

end

传入参数(控制台)

Processing by UsersController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"1hHzXu2RZR3G3Zx4PoOeDu3DlU31V5abDH/UmNx+w9hs/gacgRYhFgpe6cm0d7cLaTtZdfROi3oUrw/m5EcTAQ==", "user"=>{"firstname"=>"Milhouse", "lastname"=>"Vanhoutten", "email"=>"milhouse@thesimpsons.com", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}, "commit"=>"Register"}
Unpermitted parameters: firstname, lastname, 
   (0.4ms)  begin transaction
  SQL (0.6ms)  INSERT INTO "users" ("email", "password_digest", "created_at", "updated_at") VALUES (?, ?, ?, ?)  [["email", "milhouse@thesimpsons.com"], ["password_digest", "$2a$10$T.iv9b3BjG.t1FJvT7YsVOZf0wNOD2QSFA9lP8RGOiE1h5AaDdB2q"], ["created_at", "2016-01-18 22:12:32.764948"], ["updated_at", "2016-01-18 22:12:32.764948"]]
   (7.0ms)  commit transaction
Redirected to /users/6
Completed 302 Found in 122ms (ActiveRecord: 8.7ms)

【问题讨论】:

  • 你能显示你的用户架构(来自 schema.rb 文件)吗?
  • 显示提交的参数哈希
  • @SteveTurczyn 请参阅上面添加的架构。
  • @Brittany 你能在@user = User.new(user_params) 之前加入一个调试器并打印出params 是什么吗?该模型也很有帮助,因为问题可能就在那里。
  • @JesseWhitham 添加了 user.rb;见上文。

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


【解决方案1】:

看起来参数可能会以

{:firstname => 'foo', :lastname => 'baz'}

而不是

{"user" => {"firstname" => "foo", "lastname" => "baz"}}

大概可以追溯到形式。

【讨论】:

  • 很抱歉 newb 响应 - 但为什么这会发生在这两个值上而不是例如电子邮件价值?我该如何解决这个问题?
  • 这其实很公平。你能显示传入的参数吗?它们应该打印在 rails webserver 输出中。
  • 查看上面的传入参数 - 非常感谢,不胜感激。
  • np.. 虽然从您发布的代码中我看不出它为什么会这样。
  • 我很困惑为什么这让我很伤心 - 哈哈。当我通过终端创建用户时,它工作正常吗?
【解决方案2】:

我遇到了完全相同的问题,但使用的是更新方法。原来它是由我使用的around_update 回调引起的。我把around_update回调改成了after_update,问题就解决了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-01
    • 1970-01-01
    • 2013-09-14
    • 2023-03-23
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    • 2019-09-17
    相关资源
    最近更新 更多