【问题标题】:AssociationTypeMismatch (Object expected, got HashWithIndifferentAccess) in Rails appRails 应用程序中的 AssociationTypeMismatch(预期对象,得到 HashWithIndifferentAccess)
【发布时间】:2013-02-01 23:28:42
【问题描述】:

我收到 AssociationTypeMismatch 错误,但我不确定我在哪里犯了错误。我对 Rails 很陌生,所以我猜我犯了一些愚蠢的错误。我检查了我的语法并将其与 AssociationTypeMismatch Error on Ruby on Rails app

进行了比较

...但我似乎仍然无法捕捉到错误。

这是我的模型

class User < ActiveRecord::Base
  attr_accessible :email, :full_name, :password, :password_confirmation, :preference
  has_secure_password

  validates_uniqueness_of :email
  validates_presence_of :full_name

  has_one :preference, :dependent => :destroy

  accepts_nested_attributes_for :preference
end

class Preference < ActiveRecord::Base
  attr_accessible :background_fill, :background_position, :layout

  belongs_to :user
end

这是我的控制器:

def new
  @user = User.new
  @user.build_preference
end

def create
  @user = User.new(params[:user])
  if @user.save
    session[:user_id] = @user.id
    redirect_to root_url, notice: "Thanks for signing up!"
  else
    render "new"
  end
end

这是我的看法:

<%= form_for @user do |f| %>
  <% if @user.errors.any? %>
  <div class="error_messages">
    <h2>There's an error!</h2>
    <ul>
      <% @user.errors.full_message.each do |message| %>
        <li><%= message %></li>
      <% end %>
    </ul>
  </div>
  <% end %>
  <%= f.label :full_name %>
  <%= f.text_field :full_name, :class => "target", :placeholder => "Your full name", :maxlength => "55", :autofocus => "autofocus" %>
  <%= f.label :email %>
  <%= f.email_field :email, :class => "target", :placeholder => "example@gmail.com", :maxlength => "55" %>
  <%= f.label :password %>
  <%= f.password_field :password, :class => "target", :placeholder => "Enter a password", :maxlength => "55" %>
  <%= f.label :password_confirmation, "Confirmation" %>
  <%= f.password_field :password_confirmation, :class => "target", :placeholder => "Enter your password again", :maxlength => "55" %>
  <%= f.fields_for :preference do |builder| %>
    <%= builder.hidden_field :layout, value: params[:layout] %>
    <%= builder.hidden_field :background_fill, value: params[:background_fill] %>
    <%= builder.hidden_field :background_position, value: params[:background_position] %>
  <% end %>
  <%= f.submit "Create an Account", :class => "button cta" %>
<% end %>

还有我的参数

{"utf8"=>"✓",
"authenticity_token"=>"[redacted]=",
"user"=>{"full_name"=>"test",
"email"=>"test@example.com",
"password"=>"[FILTERED]",
"password_confirmation"=>"[FILTERED]",
"preference"=>{"layout"=>"layout-3",
"background_fill"=>"restaurant-2",
"background_position"=>"position-center"}},
"commit"=>"Create an Account"}

编辑: 我得到的错误是Preference(#70124732528700) expected, got ActiveSupport::HashWithIndifferentAccess(#70124687315200)。我的理解是@user.build_preferenceaccepts_nested_attributes_for :preference 可以单独工作。

我需要创建一个def preferences_attributes= 吗? http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-fields_for

更新 好的,所以我想我离得更近了。在 Rails 控制台中四处寻找,我想我需要在 UserController 中创建 Preference.new ,然后才能传入哈希。由于我不确定 build_preference 究竟做了什么,所以我还没有运气。

我尝试在构建首选项上方添加@user.preference = Preference.new 并将f.field_for :preference 更改为f.field_for @user.preference,但我仍然遇到同样的错误。

更新 2 对于其他陷入此问题的人,答案是将f.field_for :preference 更改为f.field_for :preference_attributes。请参阅下面zetetic 的评论。

【问题讨论】:

  • 我认为f.fields_for :preference 应该是f.fields_for :preference_attributes
  • 有效!非常感谢——我在这上面花了很多时间。上帝。

标签: ruby-on-rails ruby-on-rails-3 model


【解决方案1】:

它是:

attr_accessible :preference_attributes

并以您的形式:

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

【讨论】:

    【解决方案2】:

    试一试。

    在您的User 模型中,尝试将:preference_attributes 添加到您的attr_accessible 行。

    class User < ActiveRecord::Base
      attr_accessible :email, :full_name, :password, :password_confirmation, :preference_attributes
      .. # rest of your code goes here
    end
    

    【讨论】:

    • 感谢您的浏览。它不起作用 - 它只是给了我一个 Can't mass-assign protected attributes: preference 所以 :preference 应该是正确的选择。
    猜你喜欢
    • 1970-01-01
    • 2017-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多