代码之家  ›  专栏  ›  技术社区  ›  Jimmy

使用“接受”嵌套的“属性”来创建新记录或更新现有记录

  •  4
  • Jimmy  · 技术社区  · 16 年前

    阅读最新信息的大更新。

    大家好,

    我基本上是在寻找一个新用户创建他们的评级时,他们注册和编辑他们的任何个人资料信息在未来的日期在同一时间。

    我试着回答这个问题 Rails nested form with has_many :through, how to edit attributes of join model? 但我面临的问题是试图将一个选择列表合并到组合中,并为用户提供多个利率。

    型号代码:

    user.rb
    has_many :user_interests, :dependent => :destroy
    has_many :interests, :through => :user_interests, :foreign_key => :user_id  
    accepts_nested_attributes_for :user_interests
    
    interest.rb
    has_many :user_interests, :dependent => :destroy
    has_many :users, :through => :user_interests, :foreign_key => :interest_id, :dependent => :destroy
    
    user_interest.rb
    belongs_to :user
    belongs_to :interest
    

    查看代码:

    app/views/user/_form.html.erb
    <%= form_for(@user) do |form| %>
      ... user fields
      <%= form.fields_for :user_interests do |ui_form| %>
        ... loop through ALL interests
        <% Interest.all.each do |interest| %>
          <%= ui_form.select :rating, options_for_select(1..10) %>
          <%= ui_form.hidden_field :interest_id, :value => interest.id %>
        <% end %>
      <% end %>
    <% end %>
    

    @user.interests.build.build_interest

    Interest(#2172840620) expected, got Array(#2148226700)
    

    是什么小细节让我漏掉了或者弄错了,才导致了这个问题?

    编辑:

    我找到了一种方法来实现这一点,但是它需要在chrome开发工具中手动编辑HTML,我的表单元素的:name属性被生成为 user[user_interests_attributes][rating] 但如果我改成 user[user_interests_attributes][][rating]

    嘿,伙计们,我有一个半功能版本,做了一些小改动:

    查看代码:

    <% form.fields_for :user_interests do |ui_form| %>
    <p>
        <%= ui_form.select :rating, options_for_select(1..5), :selected => :rating %>
        <%= ui_form.label :interest_title %>
        <%= ui_form.hidden_field :interest_id %>
    </p>
    <% end %>
    

    def new
      @user = User.new
      Interest.all.each { |int| @user.user_interests.build({ :interest_id => int.id }) }
    end
    
    def edit
      @user = @current_user
      Interest.unrated_by_user_id(@user.id).each { |int| @user.user_interests.build({ :interest_id => int.id }) }
    end
    

    现在我可以编辑我的用户兴趣更新或创建,如果没有评级存在,但我得到一个错误,用户是空的,当我试图创建一个新的用户。我也无法访问表单中的任何兴趣属性来显示用户实际评分的兴趣。有人能帮上忙吗?

    1 回复  |  直到 9 年前
        1
  •  3
  •   inkdeep    16 年前

    你只需要 @user.interests.build 因为它有很多关系。 build_interest

    使用时 fields_for :user_interests 您告诉用户模型,当创建/更新用户时,一个或多个用户兴趣对象的实例将位于参数哈希中。表单不会创建或更新任何用户兴趣,但它会发回一组表示表单引用的用户兴趣的用户兴趣的哈希数组。这是一个用户兴趣评分值的数组,当您在表单中引用这些值时,不存在任何用户兴趣,这是您得到错误的原因。

    select

    经过 :multiple => true

    如果您确实希望用户能够选择许多兴趣,这是如何在 has_many :through 关系:

    <%= form_for(@user) do |f| %>
      <% f.fields_for :interest_ids  do |interest| %>
        <ul>
          <% Interest.all.each do |choice,i| %>
          <li class="selection">
            <%= interest.check_box [], { :checked => f.object.user_interest_ids.include?(choice.id) }, choice.id, ''  %>
            <%= interest.label [], choice.name %>
          </li>
        <% end %>
        </ul>
      <% end %>
    <% end %>
    
    推荐文章