Couldn't find Item with'id 해결 =
잘못된 내용
주름 앱 제작 중 구매 기능 설치 중 발생한 오류
구입 전 절차는 다음과 같습니다.
1. 상품일람페이지
2. 상품 상세 정보 페이지
- 여기 오류 -- --
3. 구매 확인 페이지
4.(구매 완료)
Couldn't find Item with 'id'=
그래서'item모델의 id를 찾을 수 없음'오류가 발생할 수 있습니다.
오류 원인
컨트롤러
우선 오류가 발생한 itmescontroller에 대해
이번 구매 확인 페이지의 동작purchase
, 구매의 동작buy
으로 itmescontroller
에 기술되어 있다.purchase
, buy
동작에 대한 설정은 item의 idbefor_action
로 되어 있어 컨트롤러에 문제가 없는 것 같습니다.
items_controller.rbbefore_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 do
→member 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=의 세 가지 확인 포인트 표시
Reference
이 문제에 관하여(Couldn't find Item with'id 해결 =), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/mogurinchu/items/61c6358a5972ef000afc
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
컨트롤러
우선 오류가 발생한 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 do
→member 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=의 세 가지 확인 포인트 표시
Reference
이 문제에 관하여(Couldn't find Item with'id 해결 =), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/mogurinchu/items/61c6358a5972ef000afc
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
(修正前)
.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=의 세 가지 확인 포인트 표시
Reference
이 문제에 관하여(Couldn't find Item with'id 해결 =), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/mogurinchu/items/61c6358a5972ef000afc텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)