我在导轨应用程序中取得了很大进展。我完成了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
答案 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。