【问题标题】:Accepting nested attributes for parent model接受父模型的嵌套属性
【发布时间】:2012-01-18 22:09:31
【问题描述】:

尝试接受用户模型的嵌套属性时出现以下错误:

Couldn't find User with ID=1 for Sale with ID=

销售模式:

class Sale < ActiveRecord::Base

   belongs_to :user

   accepts_nested_attributes_for :user

end

用户模型:

class User < ActiveRecord::Base
   has_many :sales
end

查看模板:

<%= form_for @sale, :html => {:class => "stagedForm bigForm"} do |f| %>
    <% if @sale.errors.any? %>  
        <div id="errorExplanation">  
            <h2><%= pluralize(@sale.errors.count, "error") %> prohibited this user from being saved:</h2>  
            <ul>  
                <% @sale.errors.full_messages.each do |msg| %>  
                    <li><%= msg %></li>  
                <% end %>  
            </ul>  
        </div>  
    <% end %>

    <fieldset>
    <legend>When</legend>
    <div class="field">
        <%= f.label :start_time %>
        <%= f.datetime_select :start_time, :minute_step => 10, :default => Time.now+1.week, :order => [:day, :month, :year] %>
      </div>
      <div class="field">
        <%= f.label :end_time  %>
        <%= f.datetime_select :end_time, :default => Time.now+( 1.week + 2.hours), :minute_step => 10, :order => [:day, :month, :year] %>
      </div>
    </fieldset> 

    <fieldset>
        <legend>Payment</legend>
        <%= f.fields_for :user do |u| %>
            <%= u.hidden_field :stripe_card_token %>
        <% end %>

    </fieldset>

    <div style="clear:both;"></div>
  <div class="actions">
    <%= f.submit "create", :id => "saveForm" %>
  </div>
<% end %>

销售总监:

def new
    user = User.find(current_user.id)
    @sale = user.sales.build
    logger.debug "user locations #{user.locations}"
    @locations = user.locations
    1.times { @sale.items.build; @sale.build_location; }
  end


def create
    @sale = Sale.new(params[:sale])
    @sale.user_id = current_user.id

    logger.debug "Sale object!!!  #{@sale.inspect}"
    respond_to do |format|
      if @sale.save
        format.html { redirect_to @sale, notice: 'Sale was successfully created.' }
        format.json { render json: @sale, status: :created, location: @sale }
      else
        format.html { render action: "new" }
        format.json { render json: @sale.errors, status: :unprocessable_entity }
      end
    end
  end

【问题讨论】:

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


    【解决方案1】:

    嵌套属性允许您通过父项保存关联记录的属性。所以你应该有 Accept_nested_attributes_for :sales 在用户模型中。

    当您尝试使用销售作为子记录来更新用户模型时,嵌套属性会派上用场。

    您应该使用 hidden_​​field_tag 从视图中传递 user_id(上面与 Sale 相关联),或者由于 sale 属于 User,您可以使用 select 标签来选择用户。

    http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html

    【讨论】:

    • 所以我不应该声明 Sale.new,而应该使用 User.new(但是用户已经存在于数据库中)...?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-10
    • 1970-01-01
    相关资源
    最近更新 更多