我收到了一个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_preference
和accepts_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下面的评论。
答案 0 :(得分:3)
它是:
attr_accessible :preference_attributes
并以您的形式:
<%= f.fields_for :preference_attributes do |builder| %>
...
答案 1 :(得分:1)
试一试。
在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