我遇到的问题是我在Charges Controller的show函数中声明的任何实例变量在视图中显示为nil。如果我将实例变量设置为数字,它甚至不会出现在视图中。我的home函数与实例变量完美配合。
这是我的带有Home和Show功能的控制器:
class ChargesController < ApplicationController
def home
@products = Product.all
end
def show
@product = Product.find_by(id: params[:id])
end
这是我的Show for Show功能(show.html.erb):
<h1>Product Details</h1>
<h3> <%= @product.name %> </h3>
<h4> <%= @product.price %> </h4>
<h5> <%= @product.description %> </h5>
这是我的Home功能视图,其中包含指向显示页面的按钮(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%>
答案 0 :(得分:2)
find_by
方法返回nil
。这意味着找不到您在params[:id]
模型中搜索的产品ID(Product
)。
您可以在rails控制台中手动检查它。
在终端中输入rails c
,然后尝试下面的代码
Product.find_by(id: the_id_you_want_to_search)
或者,您可以使用find
方法。当它找不到记录时会引发异常。
def show
@product = Product.find(params[:id])
end
答案 1 :(得分:0)
默认情况下,它始终为find by id
,所以请善用..
def show
@product = Product.find params[:id]
end
此外,您可以使用rails c
检查rails控制台,以验证该记录是否与该ID一起使用,例如Product.find 18
。
同时检查应与您的路线匹配的网址。例如.. /users/:id
get
请求仅映射到users#show
操作。
使用rake routes > path.text
获取路线的本地副本,并将其用作参考
答案 2 :(得分:0)
在home.html.erb中尝试更改此
<%= button_to "Product Details", charge_path(product.id), :method => "get" %>
到
<%= link_to "Product Details", charge_path(product.id) %>
然后,如果它不起作用,尝试在show方法中引发params或实例
def show
raise params.inspect
@product = Product.find params[:id]
end
或
def show
@product = Product.find params[:id]
raise @product.inspect
end
这些是一些简单的方法来检查代码中发生的事情。