Rails - nil的未定义方法`name':NilClass

时间:2010-05-16 19:52:00

标签: ruby-on-rails variables controller

快速提问。这是我的代码:

#routes
map.resources :customers, :has_many => [:addresses, :matchings]
map.connect ":controller/:action/:id"

#url path:
http://127.0.0.1:3000/customers/index/3

#customers controller
def index
  @customer = Customer.find(params[:id])
end

#customers view/index.html.erb
...
<%= @customer.name %>
...

错误:nil的未定义方法`name':NilClass。

这是我的推理。参数:id来自我的url路径(即我们在上面的路径中寻找客户#3)。 @customer应该很容易找到该数组,然后@ customer.name应该产生名称,但显然@customer是空白的。为什么呢?

我认为问题是我在控制器中没有生成数组?

------ ------ UPDATE

嗨拉里,非常感谢你的评论。

我的意思是'index'实际上是客户登录网站时会遇到的主页。 (我也有其他用户的单独登录,如雇主,他们去他们自己的索引)。我目前正在使用'list'作为客户列表,并为一个人'展示'......有更好的方法吗?

其次,最重要的是:日志没有给我根本问题的答案,即无法呈现页面。

Processing CustomersController#index (for 127.0.0.1 at 2010-05-16 16:56:19) [GET]
Parameters: {"action"=>"index", "id"=>"10", "controller"=>"customers"}
...
[4;36;1mCustomer Load (2.0ms)[0m   [0;1mSELECT * FROM "customers" WHERE ("customers"."id" = 10) [0m
[4;35;1mMatching Load (24.0ms)[0m   [0mSELECT * FROM "matchings" WHERE ("matchings".customer_id = 10) [0m
Completed in 153ms (View: 18, DB: 26) | 200 OK [http://127.0.0.1/customers/index/10]

------更新#2(最后!)------

我阅读了你所有的评论,他们帮助我不仅在我的问题上取得了进展,而且还了解了这些文章如何融合在一起。为此,谢谢大家。

亚历克斯是对的 - 我的路线没有排好他们需要的方式。我在我的客户控制器中创建了一个名为Home的新操作。这是客户登录时的基地(它不显示有关一个客户的信息,因此可能不应该显示,而且它不是列表,因此不应该是索引或列表)。

Rake routes # ...gives me a list of routes that does NOT include home. Why?

其次,如果显示的路线有,例如:

:action => "home"
/customers # (instead of what I need, '/customers/:id')

我需要做些什么来改变接受:id?

的路线

3 个答案:

答案 0 :(得分:1)

看看rake routes。资源的索引操作与id不匹配。我怀疑Rails甚至没有将id放入params用于索引操作。像Ryan说的那样,你应该使用show动作,show动作的URL将是http://localhost:3000/customers/3

如果您打算使用RESTful资源,您可能希望摆脱默认的map.connect ":controller/:action/:id"路由。

答案 1 :(得分:0)

查看您的日志,查看发送给您的控制器和操作的参数。

此外,您没有涉及为您的控制器提供无效ID的情况。

例如,应该更像是:

#customers controller
def index
  @customer = Customer.find(params[:id])
  flash[:error] = "Customer not found" and return unless @customer
end

添加了:

另请注意,在标准REST样式中,索引应该是客户列表。要查看特定客户,通常使用“显示”操作。

您对Customer.find(params [:id])的查询将返回Customer模型的一个实例,或者为nil。如果你想要一组客户,它更像是Customer.find(:all)

已添加 -

您的日志显示正在正确调用您的操作。看起来你的find语句不起作用。使用控制台并确保Customer.find(“10”)为您提供您期望的结果。

答案 2 :(得分:0)

我认为您实际上是在向show行动发出请求,而不是index行动。将该代码放在show动作中。