1

문제는 내가 충전 컨트롤러의 쇼 기능에서 선언 한 인스턴스 변수가 뷰에 nil로 표시된다는 것입니다. 인스턴스 변수를 숫자로 설정하면 뷰에 나타나지 않습니다. 우리 집 함수는 인스턴스 변수와 완벽하게 작동합니다. 이 내 시야가레일스 뷰에서 인스턴스 변수가 항상 Nil 인 이유

<h1>Product Details</h1> 

<h3> <%= @product.name %> </h3> 
<h4> <%= @product.price %> </h4> 
<h5> <%= @product.description %> </h5> 

입니다 :이 표시 기능에 대한 내보기 (show.html.erb)입니다

class ChargesController < ApplicationController 

def home 
    @products = Product.all 
end 

def show 
    @product = Product.find_by(id: params[:id]) 
end 

:

이것은 가정 및 표시 기능을 가진 내 컨트롤러입니다 쇼 페이지로 지시하는 버튼 (home.html.erb)

<h1>Products</h1> 

<% @products.each do |product| %> 
    <br> 

    <p> <%= product.name %>: $<%= product.price %> </p> 
    <p> <%= product.description %> </p> 

    <%= button_to "Product Details", charge_path(product.id), :method => "get" %> 
    <br> 

<%end%> 

error message I'm receiving가 들어있는 홈 기능 기본적으로

+1

해당 식별자를 가진 제품을 찾을 수없는 경우 예외를 throw하는'find_by!'메소드를 사용해보십시오. 오류를 나타 내기 위해 이것을'rescue_from '할 수 있습니다. 데이터베이스 작업이 성공했다고 가정하면 대개 실수입니다. – tadman

+0

하지만 Product.first와 같이 존재하더라도. 이 함수는 집 함수에서 인스턴스 변수로 설정했지만 show 함수에서는 설정하지 않으면 작동합니다. 여전히 nil이 표시됩니다. 나는 find_by를 사용할 것이다! 대신에, 고마워. –

+0

'@ products'와'@ product'을 혼동하고 있습니까? show에서 실행되는 유일한 메소드는'@ product'를 채우는 메소드입니다. 'show' 액션이'@product'를 성공적으로 채우면 뷰에서 작동합니다. 그렇지 않으면 코드의 일부 다른 비트가 값을 다시 할당하거나 그 코드가 어떻게 든 처음부터 실행되지 않았습니다. – tadman

답변

0

, 그 항상 find by id, 그래서 친절하게 만 사용 ..

def show 
    @product = Product.find params[:id] 
end 

은 또한, 당신은 레코드가 해당 ID 예를 Product.find 18를 들어, 사용에 존재하는지 확인하기 위해 rails c를 사용하여 레일 콘솔에서 확인할 수 있습니다. 또한 경로와 일치해야하는 URL을 확인하십시오. 예를 들면 은 get입니다. 요청 만 users#show 동작으로 매핑되었습니다.

rake routes > path.text를 사용하여 경로의 로컬 복사본을 취득하고 기록을 찾을 수없는 경우

+0

OP는 이미'find (params [: id])'를 사용하여 시도되었습니다. – heyitsjhu

+0

내가 언급 한 레일즈 콘솔에서 같은 ID를 확인해 보았습니까? 또한 경로 입력을 확인하십시오. – Milind

+0

예, 제품의 레일즈 콘솔에 ID가 존재합니다. 내 경로는'charges # show'이고'/ charges/: id'는'get' 요청입니다 –

2

find_by 방법은 nil을 반환 참조로 사용합니다. 즉, Product 모델에서 검색하는 제품 ID (params[:id])를 찾을 수 없습니다.

레일 콘솔에서 수동으로 확인할 수 있습니다. 터미널에서 유형 rails c는 다른 방법이 find 방법을 사용할 수 있습니다 울부 짖는 코드

Product.find_by(id: the_id_you_want_to_search) 

을 시도합니다. 레코드를 찾지 못하면 예외가 발생합니다. 당신의 home.html.erb에서

def show 
    @product = Product.find(params[:id]) 
end 
+0

레일즈 콘솔을 점검했고 제품이 존재 함 –

+0

그러면'show' 액션의'params [: id]'가 어떻게 든 잘못된 값을 얻게 될 것입니다. Bdw, 해결 되었습니까? –

+0

아니, 아직 해결되지 않았습니다. 아직도 그것에 종사하고있어. 여전히 분실 됨 –

0

변경하려고이

<%= button_to "Product Details", charge_path(product.id), :method => "get" %> 

그런

<%= link_to "Product Details", charge_path(product.id) %> 

작동하지 않는 경우에, 당신의 쇼에 PARAMS 또는 인스턴스를 인상 시도에 방법

def show 
    raise params.inspect 
    @product = Product.find params[:id] 
end 

또는

def show 
    @product = Product.find params[:id] 
    raise @product.inspect 
end 

이는 코드에서 일어나는 일을 확인하는 간단한 방법입니다.

+0

이러한 변경 사항과 다른 점은 없습니다. 여전히 같은 오류 페이지, "정의되지 않은 메소드'name 'for nil : NilClass" –

+0

컨트롤러에서 인스턴스를 발생 시켰습니까? params 또는 인스턴스를 발생시켜야합니다. 라우팅 오류가있는 것 같습니다. 당신은 쇼 방식에 들지 않습니다. –

+0

예,'raise @ product.inspect'도 추가했지만 차이는 없습니다. 라우팅 과정에서'resources : charges'가있어서'show' 경로가 자동으로 생성됩니다. –