为啥我的实例变量在我的 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 &gt; 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 渲染视图如此缓慢?

为啥所有的 Rails 助手总是对所有视图可用?有没有办法禁用它?

在 Rails 中,为啥我的邮件正文只在我的测试中是空的?

为啥 jQuery 在我的 rails 5 应用程序中不起作用?

为啥我的“允许位置访问”在我打开时总是关闭?

Rails中的全局实例变量