加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 在Rails应用程序中的AssociationTypeMismatch(

发布时间:2020-12-17 02:33:42 所属栏目:百科 来源:网络整理
导读:我收到了一个AssociationTypeMismatch错误,我不确定我在哪里弄错了.我对Rails很陌生,所以我猜我犯了一些愚蠢的错误.我检查了我的语法并将其与 AssociationTypeMismatch Error on Ruby on Rails app进行了比较 …但我仍然无法捕捉错误. 这是我的模特 class Us
我收到了一个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,:placeholder => "example@gmail.com",:maxlength => "55" %>
  <%= f.label :password %>
  <%= f.password_field :password,:placeholder => "Enter a password",:maxlength => "55" %>
  <%= f.label :password_confirmation,"Confirmation" %>
  <%= f.password_field :password_confirmation,: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"}

编辑:
我得到的错误是预期的偏好(#70124732528700),得到了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.

解决方法

它是:

attr_accessible :preference_attributes

并以您的形式:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读