为啥我的实例变量在我的 Rails 视图中总是 Nil
Posted
技术标签:
【中文标题】为啥我的实例变量在我的 Rails 视图中总是 Nil【英文标题】:Why is my instance variable always Nil in my Rails view为什么我的实例变量在我的 Rails 视图中总是 Nil 【发布时间】: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%>
error message I'm receiving
【问题讨论】:
尝试使用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])
【参考方案1】:
find_by
方法如果没有找到记录则返回nil
。这意味着您在 Product
模型中搜索的产品 id(params[:id]
) 未找到。
您可以在 Rails 控制台中手动检查它。
在终端中输入rails c
,然后尝试下面的代码
Product.find_by(id: the_id_you_want_to_search)
您也可以使用find
方法。找不到记录时会引发异常。
def show
@product = Product.find(params[:id])
end
【讨论】:
我检查了 Rails 控制台,产品确实存在 那么您的show
操作中的params[:id]
可能会以某种方式获取错误值。 bdw,解决了吗?
不,还没有解决。仍在努力。还是迷路了
您能否提供错误消息作为屏幕截图?
没问题,我在原帖里加了截图【参考方案2】:
默认情况下,它总是find by id
,所以请只使用..
def show
@product = Product.find params[:id]
end
此外,您可以使用rails c
在rails 控制台中检查,以使用例如Product.find 18
验证该记录是否存在该ID。
还要检查应该与您的路由匹配的 url..for example../users/:id
for get
request 仅映射到 users#show
操作。
使用rake routes > path.text
获取路线的本地副本并将其用作参考
【讨论】:
您是否尝试过在 Rails 控制台中验证与我提到的相同的 ID。也验证您的路线条目。 是的,rails 控制台中的 id 存在产品,我的路线是charges#show
和 /charges/:id
用于 get
请求
nil:NilClass 的未定义方法“名称”【参考方案3】:
在你的 home.html.erb 中尝试改变这个
<%= button_to "Product Details", charge_path(product.id), :method => "get" %>
到
<%= link_to "Product Details", charge_path(product.id) %>
如果它不起作用,请尝试在 show 方法中提高参数或实例
def show
raise params.inspect
@product = Product.find params[:id]
end
或
def show
@product = Product.find params[:id]
raise @product.inspect
end
这些是检查代码中发生的事情的一些简单方法。
【讨论】:
这些更改没有显示任何不同。仍然是相同的错误页面,显示“nil:NilClass 的未定义方法‘名称’” 您是否在控制器中提升了实例?它应该提高参数或实例。似乎有一个路由错误。你没有进入 show 方法。 是的,我也添加了raise @product.inspect
,但没有区别。在我的路由中,我有resources :charges
,所以它会自动创建show
路由。不知道哪里搞砸了
它没有搞砸,也许你只是指向不正确的路径,你能评论rake routes | grep charge
的输出吗?另外,您的视图文件是否在正确的目录下?在这种情况下,views/charges/show.html.erb ?
GET /charges#home 费用 GET /charges(.:format) 费用#index POST /charges(.:format) 费用#create new_charge GET /charges/new(.:format) 费用#new edit_charge GET /charges/:id/edit(.:format) 费用#edit charge GET /charges/:id(.:format) 费用#show PATCH /charges/:id(.:format) 费用#update PUT /charges/ :id(.:format) 费用#update DELETE /charges/:id(.:format) 费用#destroy以上是关于为啥我的实例变量在我的 Rails 视图中总是 Nil的主要内容,如果未能解决你的问题,请参考以下文章
为啥所有的 Rails 助手总是对所有视图可用?有没有办法禁用它?