为什么我的Rails视图中的实例变量总是为Nil

时间:2016-11-03 01:02:20

标签: ruby-on-rails ruby model-view-controller ruby-on-rails-5 instance-variables

我遇到的问题是我在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%>

error message I'm receiving

3 个答案:

答案 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

这些是一些简单的方法来检查代码中发生的事情。