在铁轨中路由#TOKEN而不是Post#ID

我在我的rails应用程序中走了很长一段路,并完成了95%。 我需要做的最后一件事是通过生成我发送给特定用户的令牌来限​​制某些用户的某些post。 我知道还有其他限制访问的方法(没有太详细)但是对于这个应用程序,它必须使用令牌。

如何让我的路由设置看起来像这个post#token_string而不是这个post#id post#token_string

更多信息:我的post控制器中的“私有”方法已经有restrict_access 。 我的post模型has_many link_tokens和我的link_tokens模型belongs_to post因为一个post会有很多link_tokens

任何灯棚都会受到赞赏。 提前谢谢(我迫不及待地想把这个应用程序包起来)

现在,我喜欢这个link_to post.name, post_url + "?token=" + @token.token结果http://localhost:3000/post/1?token=25b8af

使用find_by_token出错信息( http://localhost:3000/post/25b8af

 def show **@post = LinkToken.find_by_token(params[:token]).post** @posts = Post.order("created_at DESC") end 

我能想到的唯一方法是使用自定义路由而不是resources

 match 'posts' => 'posts#index', :via => :get match 'posts' => 'posts#create', :via => :post match 'posts/:token' => 'posts#show', :via => :get match 'posts/:token' => 'posts#update', :via => :put match 'posts/:token' => 'posts#destroy', :via => :delete match 'posts/:token/new' => 'posts#new', :via => :get match 'posts/:token/edit' => 'posts#edit', :via => :get 

然后调整你的PostsController以通过令牌而不是id来查找post:

 def show @post = LinkToken.find_by_token(params[:token]).post end 

您可以在资源中传递param参数:

 resources user, param: :token 

通往这些路线

  Prefix Verb URI Pattern Controller#Action users GET /users(.:format) users#index POST /users(.:format) users#create new_user GET /users/new(.:format) users#new edit_user GET /users/:token/edit(.:format) users#edit user GET /users/:token(.:format) users#show PATCH /users/:token(.:format) users#update PUT /users/:token(.:format) users#update DELETE /users/:token(.:format) users#destroy root GET / application#index 

自从提出这个问题已经有一段时间了,但对于书籍:

您可以尝试覆盖模型中的to_param方法: http ://apidock.com/rails/ActiveRecord/Base/to_param

无论方法返回什么,而不是id(例如在路径助手中)。

有关详细说明,请参见http://railscasts.com/episodes/63-model-name-in-url 。