【发布时间】:2016-08-31 20:16:24
【问题描述】:
我有一个 RoR 应用程序。在应用程序中,用户可以创建帖子。我已经通过resources :posts 连接了我的routes.rb 中的帖子表。现在 - 创建帖子的链接如下所示:http://mysitename.com/posts/1(其中 1 是帖子编号)。
我想做的是让rails生成链接到帖子。所以用户没有看到我的数据库中有多少帖子。因此它必须看起来像http://mysitename.com/post/generatedlink。它必须生成,例如帖子主题。
首先,我们必须在 Posts 表中创建 link 列。并让它生成类似的东西:
@post.link = @post.theme.parameterize.underscore
但我不明白,把这段代码放在哪里。
接下来的问题是:“如何将post/1 替换为@post.link?”
希望,我说清楚了。如果你说我可以提供信息,解决我的问题需要什么。
更新
@SteveTurczyn 建议后我做了什么。
我创建了一个名为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
我没有 find 方法。我的posts_controller.rb 是这样的:
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
还有html.erb:
<%= @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 %>
在主页(我有一个帖子列表)上,不断出现错误:NoMethodError in Home#index private method 'to_param' called for #<Post:0x007fae3096bf78>。
【问题讨论】:
-
也许看看这个 gem:github.com/norman/friendly_id 但是,出于学习目的,值得了解如何在没有 gem 的情况下执行此操作,因为实现起来并不难。
-
您不应该在模型定义的私有部分包含
to_param。我已经修改了我的答案以澄清这一点。
标签: ruby-on-rails ruby auto-generate