Rails自定义路由使用另一个模型id

时间:2014-06-19 08:53:02

标签: ruby-on-rails ruby ruby-on-rails-4 routing

我想创建一个自定义路线,例如'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'

2 个答案:

答案 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中使用它。

这些controllerparams的一部分,您可以使用hash等来调用它们:

enter image description here