繁体   English   中英

Rails嵌套属性无法保存

[英]Rails nested attributes are not saving

我是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部分的项目:

   <%= 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。 我已经尝试了所有在线资源,但似乎无法保存该属性。 我正在使用rails4。在此先感谢您提供的任何帮助。

  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

您尚未在create action中将结果保存到实例变量中。

尝试在您的创建操作中像这样给予。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM