快速提问。这是我的代码:
#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?
的路线答案 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动作中。