在铁轨中路由#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 。