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

时间:2013-06-03 19:49:30

标签: ruby-on-rails

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

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

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

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

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

使用find_by_tokenhttp://localhost:3000/post/25b8af

时出现

错误消息

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

3 个答案:

答案 0 :(得分:4)

您可以在资源中传递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

答案 1 :(得分:1)

我能想到的唯一方法是使用自定义路线而不是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来查找帖子:

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

答案 2 :(得分:0)

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

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

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

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