我有一个RoR应用程序。在应用程序中,用户可以创建帖子。我通过routes.rb
在我的resources :posts
中关联了帖子表格。现在 - 链接到创建的帖子看起来像:http://mysitename.com/posts/1
(其中1是帖子号码)。
我想做的是让rails生成发布链接。所以用户没有看到我的数据库中有多少帖子。结果它必须看起来像http://mysitename.com/post/generatedlink
。它必须生成,例如帖子主题。
首先,我们必须在帖子表格中创建link
列。并让它产生类似的东西:
@post.link = @post.theme.parameterize.underscore
但我不明白,在哪里放这个代码。
接下来的问题是:"如何替换post/1
的{{1}}?"
希望,我清楚自己。如果您说我可以提供信息,那么解决我的问题需要什么。
更新
在@SteveTurczyn建议之后我做了什么。
我已创建新列,名为@post.link
random_link
。
我没有碰到我的string
:
routes.rb
我的resources :posts
(帖子模型)看起来像这样:
post.rb
我没有找到方法。我的after_validation :add_link
def add_link
self.random_link = self.theme.to_slug_param
# to_slug_param it's a gem for translating from other language into english
end
def to_param
random_link
end
看起来像这样:
posts_controller.rb
和html.erb:
def show
@post = Post.find_by_random_link(params[:id])
right_menu_posts
random_link_to_other_post(@post)
end
private
def random_link_to_other_post(post)
random_post = Post.where.not(id: post.id)
@random_post = random_post.sort_by {rand}.first
end
def right_menu_posts
@posts_for_video_in_right_menu = Post.where(video: true)
end
在主页上(我有帖子列表),不断收到错误:<%= @post.theme %>
<%= @post.content %>
<% for post in @random_post %>
<%= link_to post %>
<% end %>
<% for post in @posts_for_video_in_right_menu %>
<%= link_to post %>
<% end %>
。
答案 0 :(得分:3)
这项技术被称为slugifying
,您需要做三件事......
(1)在slug
表中创建一个名为posts
的新字段。
(2)将此代码添加到您的Post
模型...
after_validation :generate_slug
private
def generate_slug
self.slug = theme.parameterize.underscore
end
public
def to_param
slug
end
(3)最后,在您拥有find_post
方法的控制器中,将其重写为...
def find_post
Post.find_by_slug(params[:id])
end
模型中的to_param
方法是post_path(@post)
之类的内容构建网址... to_param
如果没有替换id
字段,而是编写自己的字段to_param
方法可以确保替换slug
字段。
确保'to_param'是一个公共方法!不要将它放在模型的私有部分。您可以通过在public
方法之前放置to_param
来实现此目的。然后,如果后续方法是私有的,则应将private
放在方法定义之后。