我有一个名为“Post”的模型,它有一个用户定义的guid整数字段以及一个用作博客的名称字段。我需要做的是能够通过添加guid或名称参数找到帖子的帖子,但不能一起添加,如果guid被请求,它会重定向到帖子的名称参数。我有一条名为blog
的路线,我将其用作路径,而不是post
。
(例如:http://mysite/blog/53
重定向到http://mysite/blog/name-given-to-the-post)
我设法让它工作,但我知道这是非常低效的,因为它正在发出两个几乎相同的查找请求,但我知道没有别的方法可以做到。
Post_controller.rb
def show
@post = Post.find_by guid: params[:guid]
@slug = Post.find_by_slug(params[:guid])
if request.path != blog_path(@slug)
redirect_to blog_path(@post)
end
end
我在路线中将blog
映射到post
,这就是为什么您会看到blog_path
的原因:
get 'blog/:guid', to: 'posts#show', as: 'blog'
resources :posts, path: 'blog', as: 'blog'
Post.rb(型号):
class Post < ActiveRecord::Base
before_create :create_slug
def to_param
slug
end
def create_slug
self.slug = self.name.parameterize
end
.....
end
我还必须在show.html.erb文件中将@post
更改为@slug
,因为我不幸使用了逻辑的向后类型。
<%= @slug.name %>
<%= sanitize(@slug.summary) %>
答案 0 :(得分:1)
我不理解您帖子中的所有问题,尤其是有关@post
和@slug
内容的部分......
为什么不将两个变量分配给同一个对象?它应该是同一个对象,无论它是通过slug或名称从数据库中获取的,还是我错了?
您可以使用OR
Post.where('slug = ? OR name = ?', params[:guid], params[:guid])
查询来查询对象