首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails应用程序中的AssociationTypeMismatch (Object expected,got )

Rails应用程序中的AssociationTypeMismatch (Object expected,got )
EN

Stack Overflow用户
提问于 2013-02-01 23:28:42
回答 2查看 7.7K关注 0票数 4

我得到了一个AssociationTypeMismatch错误,我不知道我在哪里出错。我对Rails很陌生,所以我猜我犯了一些愚蠢的错误。我检查了我的语法并将其与AssociationTypeMismatch Error on Ruby on Rails app进行了比较

..。但我似乎还是抓不到这个错误。

这是我的模特

代码语言:javascript
复制
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

这是我的控制器:

代码语言:javascript
复制
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

以下是我的看法:

代码语言:javascript
复制
<%= 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 %>

和我的参数

代码语言:javascript
复制
{"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=for

更新,好的,我想我会更近一点。在rails控制台中穿插时,我想我需要在UserController中创建UserController,然后才能传递哈希。由于我不确定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的评论。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-28 14:02:22

它是:

代码语言:javascript
复制
attr_accessible :preference_attributes

以你的形式:

代码语言:javascript
复制
<%= f.fields_for :preference_attributes do |builder| %>
...
票数 4
EN

Stack Overflow用户

发布于 2013-02-02 00:56:28

试试看。

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

代码语言:javascript
复制
class User < ActiveRecord::Base
  attr_accessible :email, :full_name, :password, :password_confirmation, :preference_attributes
  .. # rest of your code goes here
end
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14656812

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档