Rails嵌套属性不保存

时间:2014-04-19 21:45:28

标签: ruby-on-rails persistence

我是rails的新手,正在学习为学校完成一个库存系统数据库项目。

这是我的物品型号:

class Item < ActiveRecord::Base
  self.primary_key ='item_id'

  validates :item_id, :presence => true

  has_one :vendor_item, :dependent => :destroy
  has_one :vendor, :through => :vendor_item

  accepts_nested_attributes_for :vendor_item
end

这是我的项目控制器:

    class ItemsController < ApplicationController
  def new
      @item = Item.new
      @all_vendors = Vendor.all
      @item_vendor = @item.build_vendor_item

  end

    def create
     @item = Item.new(item_params)


     vendor = params[:vendors][:id]
     @item_vendor = @item.build_vendor_item(:vendor_id => vendor)
     @item_vendor.save

     #raise params.inspect
     if @item.save
       redirect_to @item
     else 
       render 'new'
     end
    end

    def show
      @item = Item.find(params[:id])
      @item_vendor = @item.vendor_item

    end

    def index
      @items = Item.all

    end

    def priceUnder500
      @priceUnder500 = Item.where("price < ?", 500)
      respond_to do |format|
        format.html
        format.js
      end
    end

    def priceOver500
      @priceOver500 = Item.where("price > ?", 500)
      respond_to do |format|
        format.html
        format.js
      end
    end

    def edit
      @item = Item.find(params[:id])
      @all_vendors = Vendor.all    
      @vendor_item = @item.vendor_item
    end

    def update
      @item = Item.find(params[:id])
      vendor = params[:vendors][:id]    

      if @item.vendor_item.blank?   
      @item.build_vendor_item(:vendor_id => vendor)
    end


      if @item.update(params[:item].permit(:item_id, :name, :category, :description, :reorder_level, :quantity, :price, :vendor_item_attributes => [:vendor_item_id]))  
        redirect_to items_path
      else 
        render 'edit'
      end
    end

    def destroy
      @item = Item.find(params[:id])
      @item.destroy


      redirect_to items_path
    end



    private
    def item_params
      params.require(:item).permit(:item_id, :name, :category, :description, :reorder_level, :quantity, :price, :vendor_item_attributes => [:vendor_item_id])
    end
  end

我的

   <%= form_for @item do |f| %>
  <% if @item.errors.any? %>
  <div id="error_explanation">
    <h2><%= pluralize(@item.errors.count, "error") %> prohibited
      this post from being saved:</h2>
    <ul>
    <% @item.errors.full_messages.each do |msg| %>
      <li><%= msg %></li>
    <% end %>
    </ul>
  </div>
  <% end %>

  <p>
    <%= f.label :item_id, 'Item Id' %><br>
    <%= f.text_field :item_id %>
  </p>

  <%= fields_for @item_vendor do |vii| %>
  <div class= "vendorItemId">

  <%= vii.label :vendor_item_id%>
  <%= vii.text_field :vendor_item_id%><br>

  </div>
  <% end %>

  <p>
    <%= f.label :name %><br>
    <%= f.text_field :name %>
  </p>

  <p>
    <%= f.label :category %><br>
    <%= f.text_field :category %>
  </p>

  <p>
    <%= f.label :description %><br>
    <%= f.text_area :description %>
  </p>

  <p>
    <%= f.label :reorder_level %><br>
    <%= f.text_field :reorder_level %>
  </p>

  <p>
    <%= f.label :quantity %><br>
    <%= f.text_field :quantity %>
  </p>

  <p>
    <%= f.label :price %><br>
    <%= f.text_field :price %>
  </p>

  <h3>Vendors:</h3>
  <%= fields_for(@item_vendor) do |ab| %>
  <div class= "field">

    <%= ab.label "All Vendors:" %><br>
    <%= collection_select(:vendors, :id, @all_vendors, :id, :name, {},{:multiple => false})%>
  </div>
  <% end %>


  <p>
    <%= f.submit %>
  </p>

<% end %>

vendor_item包含对item_id,vendor_id的引用,并具有vendor_item_id的另一个属性。程序保存时,item_id和vendor_id保存但vendor_item_id不保存。我已经尝试过每个在线资源,但似乎无法获得一个属性来保存。我正在使用rails 4.提前感谢您提供的任何帮助。

2 个答案:

答案 0 :(得分:0)

  def create
    @item = Item.new(item_params)

    @vendor = params["item"]["vendors"]


   if @item.save
       @item.create_vendor_item(@vendor.id => vendor).save
       redirect_to @item
   else 
       render 'new'
   end
  end

答案 1 :(得分:0)

您尚未将结果保存在create操作中的实例变量中。

尝试在创建操作中这样做。

def create
    @item = Item.new(item_params)

    vendor = params[:vendors][:id]
    @item_vendor = @item.build_vendor_item(:vendor_id => vendor)

    if @item.save
      redirect_to @item
    else 
      render 'new'
    end
  end