【问题标题】:Unpermitted Parameters Error for Whitlisted Attributes列入白名单的属性出现未经允许的参数错误
【发布时间】:2014-09-05 02:19:07
【问题描述】:

我正在使用 Rails 开发一种基于网络的游戏。我的目标是设置一个表单,允许用户通过用户更新表单在用户/显示页面上创建堡垒。我一直在使用嵌套属性和关联来尝试解决问题,但我一直遇到错误。

我在我的模型中设置了如下关联:

class Fort < ActiveRecord::Base

  belongs_to :user

end


class User < ActiveRecord::Base

  has_many :forts

  accepts_nested_attributes_for :forts

... (omitted validations)

end

我已经设置了我的用户控制器,更新和编辑操作如下:

def edit

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

end

def update

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

    @user.forts.build(params[:user][:forts])

    if @user.update_attributes(user_params)

    render @user


    else

        render 'users/show'

    end
end

用户/显示视图中的我的表单如下所示:

<%= form_for @user do |f| %>

  <%= f.fields_for :fort do |builder| %>
      <%= builder.label :name, "Name" %>
      <%= builder.text_field :name %>
      <%= builder.label :ownership, "Ownership" %>
      <%= builder.text_field :ownership %>
  <% end %>
    <%= f.submit %>
<% end %>

我的路线(我认为它们在这里并不重要,但以防万一),

BR::Application.routes.draw do
    resources :users
    resources :sessions, only: [:new, :create, :destroy]
    resources :forts
    resources :encampments

    root 'home#home'
    match '/signup',  to: 'users#new',            via: 'get'
    match '/signin',  to: 'sessions#new',            via: 'get'
    match '/signout',  to: 'sessions#destroy',            via: 'delete'

最后我的参数是这样写的:

    def user_params

        params.require(:user).permit(:name, :email, :username, :password, :password_confirmation, forts_attributes: [ :name, :xco, :yco, :territory, :ownership ])

    end

我在上述之间摇摆不定

    def user_params

        params.require(:user).permit(:name, :email, :username, :password, :password_confirmation, forts_ids: [ :name, :xco, :yco, :territory, :ownership ])

    end

    def user_params

        params.require(:user).permit(:name, :email, :username, :password, :password_confirmation, :forts => [ :name, :xco, :yco, :territory, :ownership ])

    end

基于我在其他 Stack Overflow 线程上看到的不同协议。所有排列都不起作用。

他们都在日志中抛出了这个错误:

Unpermitted parameters: fort

整个过程是这样的:

Started PATCH "/users/1" for 127.0.0.1 at 2014-09-04 20:35:02 -0400
Processing by UsersController#update as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"srybKv+WDZubO4ez+kiwfTYZvrP4tZYe9QoxQaMgmPk=", "user"=>{"fort"=>{"name"=>"test2", "ownership"=>"43"}}, "commit"=>"Update User", "id"=>"1"}
  User Load (0.2ms)  SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1  [["id", "1"]]
Unpermitted parameters: fort
   (0.1ms)  begin transaction
  User Exists (0.3ms)  SELECT 1 AS one FROM "users" WHERE (LOWER("users"."email") = LOWER('ascottpedersen@gmail.com') AND "users"."id" != 1) LIMIT 1
   (0.1ms)  rollback transaction
  Rendered users/show.html.erb within layouts/application (49.2ms)
  User Load (0.4ms)  SELECT "users".* FROM "users" WHERE "users"."remember_token" = '0705e5d60cc1be62fa51d8e407683e79f730a3b2' LIMIT 1
Completed 200 OK in 173ms (Views: 66.1ms | ActiveRecord: 5.1ms)

我很确定我点缀了我的 I 并交叉了我的 T,但现在我正在努力寻找我的错误。你们能给予的任何帮助,我都会永远感激不尽。我仍然可以想象的唯一问题是我在我的用户/显示视图中放置了一个更新表单,但我几乎可以肯定这是一件好事。

再次感谢,

亚历克斯

【问题讨论】:

    标签: ruby ruby-on-rails-4 nested-attributes strong-parameters fields-for


    【解决方案1】:

    您的参数名称与您的 user_params 方法中的名称不匹配:一个是 fort,另一个是 forts

    此外,要使嵌套属性起作用,传递给fields_for 的名称必须与关联名称匹配(即:forts

    这将导致堡垒的参数位于forts_attributes 键下(因此应该进入user_params,但只有在您将调用更改为fields_for 后)

    【讨论】:

    • 这行得通。万分感谢!我仍然无法保存交易,但错误消失了。我可能会弄清楚。谢谢
    【解决方案2】:

    因为你的User 模型中有has_many :forts 关系,所以这条线

    <%= f.fields_for :fort do |builder| %>
    

    应该是

    <%= f.fields_for :forts do |builder| %> 
    

    我猜这是给你造成的问题。

    【讨论】:

    • 这是对的,但我猜另一个答案是第一个。谢谢你
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-02
    • 2016-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多