Rails,如何更改自动生成 link
Rails, how to change automatic generated link
我有一个 RoR 应用程序。在应用程序中,用户可以创建 posts。我已经通过 resources :posts
在我的 routes.rb
中连接了帖子 table。现在 - link 到创建的 post 看起来像:http://mysitename.com/posts/1
(其中 1 是 post 数字)。
我想做的是让 rails 生成 link 到 post。所以用户没有看到我的数据库中有多少 posts。结果它必须看起来像 http://mysitename.com/post/generatedlink
。它必须生成,例如 post theme.
首先,我们必须在帖子 table 中创建 link
列。并让它生成类似的东西:
@post.link = @post.theme.parameterize.underscore
但是我不明白,把这段代码放在哪里。
下一个问题是:"How to replace post/1
for @post.link
?"
希望,我说清楚了。如果你说我可以提供信息,需要什么来解决我的问题。
更新
@SteveTurczyn 建议后我做了什么。
我创建了一个名为 random_link
的新专栏 string
。
我没碰我的 routes.rb
:
resources :posts
我的 post.rb
(post 型号)看起来像这样:
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
看起来像这样:
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 %>
在主页上(我有一个 post 的列表)不断出现错误:NoMethodError in Home#index private method 'to_param' called for #<Post:0x007fae3096bf78>
.
该技术被称为 slugifying
,您需要做三件事...
(1) 在 posts
table.
中创建一个名为 slug
的新字段
(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)
构建 url... to_param
如果未替换则替换 id
字段,但通过编写自己的 to_param
方法,您可以确保替换 slug
字段。
确保'to_param'是一个public方法!不要将它放在模型的私有部分。您可以通过在 to_param
方法之前立即放置 public
来做到这一点。如果后续方法是私有的,则应在方法定义之后放置 private
。
我有一个 RoR 应用程序。在应用程序中,用户可以创建 posts。我已经通过 resources :posts
在我的 routes.rb
中连接了帖子 table。现在 - link 到创建的 post 看起来像:http://mysitename.com/posts/1
(其中 1 是 post 数字)。
我想做的是让 rails 生成 link 到 post。所以用户没有看到我的数据库中有多少 posts。结果它必须看起来像 http://mysitename.com/post/generatedlink
。它必须生成,例如 post theme.
首先,我们必须在帖子 table 中创建 link
列。并让它生成类似的东西:
@post.link = @post.theme.parameterize.underscore
但是我不明白,把这段代码放在哪里。
下一个问题是:"How to replace post/1
for @post.link
?"
希望,我说清楚了。如果你说我可以提供信息,需要什么来解决我的问题。
更新
@SteveTurczyn 建议后我做了什么。
我创建了一个名为 random_link
的新专栏 string
。
我没碰我的 routes.rb
:
resources :posts
我的 post.rb
(post 型号)看起来像这样:
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
看起来像这样:
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 %>
在主页上(我有一个 post 的列表)不断出现错误:NoMethodError in Home#index private method 'to_param' called for #<Post:0x007fae3096bf78>
.
该技术被称为 slugifying
,您需要做三件事...
(1) 在 posts
table.
slug
的新字段
(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)
构建 url... to_param
如果未替换则替换 id
字段,但通过编写自己的 to_param
方法,您可以确保替换 slug
字段。
确保'to_param'是一个public方法!不要将它放在模型的私有部分。您可以通过在 to_param
方法之前立即放置 public
来做到这一点。如果后续方法是私有的,则应在方法定义之后放置 private
。