我想创建一个自定义路线,例如'photos /:user_id /:photo_id',用于显示每张照片。 在我的路线文件中,我有;
get 'photos/:user_id/:photo_id' => 'photos#show', :as => 'user_photo'
和rake routes
给了我
user_photo GET /photos/:user_id/:photo_id(.:format) photos#show
编辑;
现在,当我使用link_to 'some photo', user_photo_path(@photo,@user)
链接到照片时,我收到以下错误
Processing by PhotosController#show as HTML
Parameters: {"user_id"=>"8", "photo_id"=>"8"}
User Load (0.6ms) SELECT "users".* FROM "users" WHERE "users"."id" = 8 ORDER BY "users"."id" ASC LIMIT 1
Completed 404 Not Found in 3ms
ActiveRecord::RecordNotFound - Couldn't find Photo without an ID:
activerecord (4.1.1) lib/active_record/relation/finder_methods.rb:402:in `find_with_ids'
activerecord (4.1.1) lib/active_record/relation/finder_methods.rb:68:in `find'
activerecord (4.1.1) lib/active_record/querying.rb:3:in `find'
() Users/batman/code/myapp/app/controllers/photos_controller.rb:73:in `set_photo'
答案 0 :(得分:4)
您需要将其添加到params:
link_to 'some photo', user_photo_path(@photo.user, @photo)
第二个错误是由您寻找照片的方式引起的。你最有可能这样做:
photo = Photo.find(params[:id])
如果是这种情况,您需要将params[:id]
更改为parmas[:photo_id]
(如果在before_filter
中完成此操作,可能会制止其他操作或将您的路线更改为:
get 'photos/:user_id/:id' => 'photos#show', :as => 'user_photo'
答案 1 :(得分:1)
我正在写这个答案,所以我会继续
-
<强>路线强>
Shallow nesting可能是更好的方法:
#config/routes.rb
resources :users do
resources :photos, shallow: true #-> /user/photos/:id
end
-
<强>查找强>
你遇到的问题是,虽然你发送了正确的参数,你的控制器很可能无法使用你拥有的代码构建模型。
BroiStatse
提到您应该更改Photo.find(params[:id])
- 原因是当您使用Model.find ___
时,您告诉Model
查找{{1}根据您传递给它的值在数据表中
如果您设置了primary key
参数,则使用params[:id]
就可以了(因为它在大多数情况下都是如此)。但是,您没有设置它,导致您的控制器无法找到记录:
id
这些是您收到的参数 - 因此您的错误是:
ActiveRecord :: RecordNotFound - 找不到没有ID的照片
基本上意味着你没有为Parameters: {"user_id"=>"8", "photo_id"=>"8"}
方法设置参数。要解决此问题,您应该使用find
参数:
photo_id
-
<强> PARAMS 强>
当您在应用程序中请求控制器操作时,您基本上会向Rails发送一系列#app/controllers/photos_controller.rb
def show
photo = Photo.find params[:photo_id]
end
,然后可以在params
中使用它。
这些controller
是params
的一部分,您可以使用hash
等来调用它们: