0

我在 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_token( http://localhost:3000/post/25b8af)时的错误消息

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

3 回答 3

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
于 2015-08-10T10:03:45.700 回答
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
于 2013-06-03T20:04:18.883 回答
0

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

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

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

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

于 2013-10-29T10:59:57.487 回答