Rails,如何更改自动生成的链接

时间:2016-08-31 20:16:24

标签: ruby-on-rails ruby auto-generate

我有一个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 %>

1 个答案:

答案 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放在方法定义之后。