【发布时间】:2016-11-03 01:02:20
【问题描述】:
我遇到的问题是,我在 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 函数的视图(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%>
【问题讨论】:
-
尝试使用
find_by!方法,如果找不到具有该标识符的产品,该方法将引发异常。你可以rescue_from这个来显示一个错误。假设任何数据库操作成功通常是错误的。 -
但是即使存在,比如Product.first。如果我将它设置为我的 home 函数中的一个实例变量,而不是 show 函数,那将有效。仍然会显示 nil。我将使用 find_by!不过,谢谢。
-
您是否将
@products与@product混淆了?在节目中执行的唯一方法是填充@product的方法。如果show操作成功填充@product,那么它将在视图中工作。如果没有,要么是其他一些代码重新分配了值,要么是该代码一开始就没有被执行。 -
不确定您是否喜欢在此处使用
find_by,但由于您使用id作为参数,请尝试改用find(params[:id]),看看它抛出了什么错误。默认情况下,如果find_by没有找到您传入的内容,它只会返回nil。另一方面,find会告诉你出了什么问题,也许是RecordNotFound? -
@iamjhu 即使我使用
find(params[:id])
标签: ruby-on-rails ruby model-view-controller ruby-on-rails-5 instance-variables