>

2 개의 컨트롤러가 있습니다- ItemsController  그리고 TradesController . 나는 @trade 를 구축하고 있습니다   ItemsController 내부   #show  액션, TradesController 로 전송   #create  양식이있는 작업.

class ItemsController < ApplicationController
 def show
  @item = Item.friendly.find(params[:id])
  @trade = current_user.requested_trades.build
  @approved_trades = @item.trades
  respond_to do |format|
   format.html
   format.json { render :json => @items.to_json(:methods => [:image_url]) }
  end
end
class TradesController < ApplicationController
 def create
  @trade = current_user.requested_trades.build(trade_params)
  respond_to do |format|
   if @trade.save
    format.html { redirect_to @trade, notice: "Your request for trade has been submitted. You will be notified once it is approved or denied." }
    format.json { render :index, status: :created, location: @trade }
   else
    format.html { redirect_to @trade, notice: "Pick another amount" }
   end
  end
 end
 private
 def trade_params
  params.require(:trade).permit(:trade_requester, :trade_recipient, :wanted_item, :collateral_item, :shares)
 end
end

그리고 여기 내 Trade 가 있습니다.  모델

class Trade < ActiveRecord::Base
 belongs_to :trade_requester, class_name: "User"
 belongs_to :trade_recipient, class_name: "User"
 belongs_to :wanted_item, class_name: "Item"
 belongs_to :collateral_item, class_name: "Item"
end

Item's 의 양식은 다음과 같습니다.   show  보기 :

<%= form_for(@trade) do |f| %>                  
 <%= f.hidden_field :wanted_item, value: @item.id %>
 <div class="field">
  <%= f.text_field :shares, placeholder: "Pick a number between 1 and #{@item.shares}" %>
  <%= f.submit "Trade", class: "button minty-button wide-button" %>     
 </div>
<% end %>

위의 ItemsController 코드   TradesController 에 게시물   create  액션, 그러나 ActiveRecord::AssociationTypeMismatch in TradesController#createItem(#70095717466760) expected, got String(#70095657672800) 라는 오류가 발생합니다.

Item 를 기대 하는가 ? @trade 라면  생성 오류가 발생하면 @trade 로 리디렉션되어야합니다. .

  • 답변 # 1

    빠른 해결책은 :wanted_item 에서 숨겨진 필드를 변경하는 것입니다   :wanted_item_id 로 :

     <%= form_for(@trade) do |f| %>                  
        <%= f.hidden_field :wanted_item_id, value: @item.id %>
        <div class="field">
          <%= f.text_field :shares, placeholder: "Pick a number between 1 and #{@item.shares}" %>
          <%= f.submit "Trade", class: "button minty-button wide-button" %>     
        </div>
      <% end %>
    
    

    또한 당신의 trade_params 를 확인하십시오  방법은 wanted_item_id 를 허용합니다 :

    def trade_params
      params.require(:trade).permit(:trade_requester, :trade_recipient, :wanted_item_id, :collateral_item_id, :shares)
    end
    
    

    :collateral_item 와 비슷한 문제가있을 수 있습니다  다른 형태로.

  • 이전 r - 조건부로 rbind ()
  • 다음 python - 퍼그&장고 - 역 url + 변수 인라인?