2016-06-11 11 views
0

私はAjaxオブジェクトを構築しようとしていると私はおかしいのエラーを取得していますを作る...ここRailsの4処理不能エンティティエラーAjaxのポスト

ここ
<%= f.fields_for :order_item do |ff| %> 
    <div class="col-md-4"> 
     <%= ff.hidden_field :quote_id, value: @quote.id %> 
     <%= ff.collection_select :category_id, Category.order(:name), :id, :name, include_blank: "Select Category", hide_label: true %> 
    </div> 
    <div class="col-md-6"> 
     <%= ff.grouped_collection_select :product_id, Category.order(:name), :products, :name, :id, :name, include_blank: true, hide_label: true %> 
    </div> 
    <div class="col-md-2"> 
     <%= ff.submit "Add Item", class:"btn-u btn-u-blue pull-right", id:"add_item" %> 
    </div> 
    <% end %> 

は私である私のネストされたフォームフィールドですquote.js.coffee私はここに私のAJAX呼び出し

$('form').on 'click', '#add_item', (e) -> 
e.preventDefault() 
product = $('#quote_order_item_product_id :selected').val() 
quote = $('#quote_order_item_quote_id').val() 
console.log(product) 
console.log(quote) 
$.ajax '/order_items', 
    type: 'POST' 
    dataType: 'json' 
    data: { order_item: { product_id: product, quote_id: quote } } 
    success:(data) -> 
    alert data.id 
    return false 
    error: (jqXHR, textStatus, errorThrown) -> 
    alert textStatus 
    return false 

を作っていますどこに私のコントローラである(のparamsはproduct_idquote_idを受け入れる)

ここで
def create 
@order_item = OrderItem.new(order_item_params) 
respond_to do |format| 
    if @order_item.save 
    format.json { render :show, status: :created, location: @order_item } 
    else 
    format.json { render json: @order_item.errors, status: :unprocessable_entity } 
    end 
end 
end 

ここ

belongs_to :quote 
belongs_to :product 
    # validates :quantity, presence: true, numericality: { only_integer: true, greater_than: 0 } 
    before_save :set_quantity 
    before_save :set_unit_price 

    def total_price 
    unit_price * quantity 
    end 

    def set_unit_price 
    product = Product.find(self.product_id) 
    self.unit_price = product.price 
    end 

    def set_quantity 
    if quantity.nil? 
     self.quantity = 1 
    end 
    end 

    private 
    def product_present 
    if product_id.nil? 
     errors.add(:product, "is not valid or is not active.") 
    end 
    end 

    def quote_present 
    if quote_num.nil? 
     errors.add(:quote, "is not a valid quote.") 
    end 
    end 

    def finalize 
    self[:unit_price] = unit_price 
    self[:total_price] = quantity * self[:unit_price] 
    end 
end 

を要求したとして、私のORDER_ITEMモデルである私も、データがこの形式で

data: { product_id: product, quote_id: quote } 
を掲載している作るしようとした私のルート

resources :order_items, only: [:create, :update, :destroy] 

です

+0

'@ order_item.save'が' false'を返すので、いくつかの検証エラーがあることを意味します。 – Kkulikovskis

+0

yrコンソールパラメータを投稿できますか? – 7urkm3n

+0

私はモデルを追加してみましたので、みんなが見直すことができます –

答えて

1

いくつかのバリデーションがあるようですので、アノテーションは空のオブジェクトを保存します。

空のオブジェクトは、要求のparamsで初期化していないため、常に保存しようとしています。あなたがしようとした形式でのparamsを送信レール規則に保つために

order_item: { product_id: product, quote_id: quote }

は、その後、あなたのコントローラでこの

def create 
@order_item = OrderItem.new(order_item_params) 
respond_to do |format| 
    if @order_item.save 
    format.json { render :show, status: :created, location: @order_item } 
    else 
    format.json { render json: @order_item.errors, status: :unprocessable_entity } 
    end 
end 
end 

private 

def order_item_params 
params.require(:order_item).permit(:product_id, :quote_id) 
end 

にコードを変更するあなたの問題は、このラインとありました引数を必要とした @order_item = OrderItem.new(それをホワイトリストにすることをお勧めします)。

P.S.それでも動作しない場合はOrderItemモデルの検証を提供してください。

+0

モデルから検証を追加しましたが、そのルートhttp:// localhost:3000/order_items - 404 Not Foundという別のエラーが表示されています。 –

+0

私は私の引用符のコントローラーから '/ order_items'というルートを呼んでいたので、ルートを見つけることができませんでした。私は私のルートに 'post 'quotes /:id/order_items' => 'order_items#create''というルートを作成しました。あなたの助けに感謝! –