Couldn't find Item with'id 해결 =

9043 단어 RubyRails

잘못된 내용


주름 앱 제작 중 구매 기능 설치 중 발생한 오류
구입 전 절차는 다음과 같습니다.
1. 상품일람페이지
2. 상품 상세 정보 페이지
- 여기 오류 -- --
3. 구매 확인 페이지
4.(구매 완료)
Couldn't find Item with 'id'= 그래서'item모델의 id를 찾을 수 없음'오류가 발생할 수 있습니다.

오류 원인


컨트롤러


우선 오류가 발생한 itmescontroller에 대해
이번 구매 확인 페이지의 동작purchase, 구매의 동작buy으로 itmescontroller에 기술되어 있다.purchase, buy 동작에 대한 설정은 item의 idbefor_action로 되어 있어 컨트롤러에 문제가 없는 것 같습니다.
items_controller.rb
before_action :set_item, only: [:edit, :update, :destroy, :purchase, :buy]
#------省略--------
def purchase
    card = Card.where(user_id: current_user.id).first
end

def buy
    card = Card.where(user_id: current_user.id).first
    Payjp.api_key = Rails.application.secrets.payjp_private_key
    Payjp::Charge.create(
    :amount => @item.price,
    :customer => card.customer_id,
    :currency => 'jpy',
    )
    redirect_to root_path
 end

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

  def item_params
    params.permit(
      :name,
      :item_condition_id,
      :introduction,
      :price,
      :prefecture_code,
      :trading_status,
      :postage_payer_id,
      :size_id,
      :preparation_day_id,
      :postage_type_id,
      :category_id,
      item_imgs_attributes: [:src, :_destroy, :id]
      ).merge(seller_id: current_user.id, trading_status: 0)
  end

경로


다음purchase 터미널에서 동작을 수행하는 경로를 확인합니다.
★ 이런 루트 설정이 잘못된 이유입니다.purchase 동작의 URI Pattern에는 id가 없습니다.
루트에 id를 불러오지 않았지만 컨트롤러가 id를 설정했기 때문에 당연히 오류가 발생할 수 있습니다.
($rails routes)
 purchase_items  GET      /items/purchase(.:format)        items#purchase
 buy_items     POST     /items/buy(.:format)             items#buy
그러면 라우팅 설명 내용을 확인하고 수정합니다.
routes.rb
#ーーーーーーーー 修正前 ーーーーーーーーーー
resources :items do
    collection do
      get 'get_category_children', defaults: { format: 'json' }
      get 'get_category_grandchildren', defaults: { format: 'json' }
      get 'purchase', to: 'items#purchase'
      post 'buy', to: 'items#buy'
    end
  end
#ーーーーーーーー 修正後 ーーーーーーーーーー
resources :items do
    collection do
      get 'get_category_children', defaults: { format: 'json' }
      get 'get_category_grandchildren', defaults: { format: 'json' }
    end
    member do
      get 'purchase', to: 'items#purchase'
      post 'buy', to: 'items#buy'
    end
  end

위에서 말한 바와 같이 resources :items do에 끼워 넣은'purchase'buy 동작의 루트는 collection domember do로 변경되었다.
이번처럼 id가 필요할 때 사용member, 필요 없을 때 사용collection.
수정 후 터미널에서 다시 확인
($rails routes)
 purchase_items  GET      /items/:id/purchase(.:format)        items#purchase
 buy_items     POST     /items/:id/buy(.:format)             items#buy


경로 변경과 함께 페이지 이동에 사용되는 경로 변경이 완료되었습니다!!
잊지 않도록 주의하십시오(@item.id).
item-detail.html.hanl

(修正前)
.item-price__purchase-button
  = link_to "購入画面に進む", purchase_items_path
(修正後)
.item-price__purchase-button
  = link_to "購入画面に進む", purchase_item_path(@item.id)

참고 문장


오류를 해결하기 전에 참고했던 글이나 관련된 곳에서 배운 글이다.
Rails의 라우팅 유형 및 주요 사항 요약
Rubby on Rails 오류 Couldn't find with id=의 세 가지 확인 포인트 표시

좋은 웹페이지 즐겨찾기