【问题标题】:Rails, how to change automatic generated linkRails,如何更改自动生成的链接
【发布时间】: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 #&lt;Post:0x007fae3096bf78&gt;

【问题讨论】:

  • 也许看看这个 gem:github.com/norman/friendly_id 但是,出于学习目的,值得了解如何在没有 gem 的情况下执行此操作,因为实现起来并不难。
  • 您不应该在模型定义的私有部分包含 to_param。我已经修改了我的答案以澄清这一点。

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


【解决方案1】:

该技术被称为slugifying,您需要做三件事......

(1) 在您的 posts 表中创建一个名为 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 方法之前来做到这一点。如果后续的方法是私有的,你应该在方法定义之后加上private

【讨论】:

  • 我明白了。不错的方式。但结果 link_to 标记现在工作不同了。例如:它是&lt;%= link_to @post %&gt;,但现在它的工作方式是这样的:&lt;%= link_to @post.slug %&gt;(在我的应用程序中它是@post.random_link)。你能帮我解决一下吗?
  • 不,由于 to_param 更改,您仍然可以执行 link_to @post
  • 添加到问题后出现什么问题
  • 我已经修改了我的答案以澄清,但基本上你将to_param 设为私有方法,而不是公共方法。
猜你喜欢
  • 1970-01-01
  • 2013-10-26
  • 1970-01-01
  • 1970-01-01
  • 2012-02-17
  • 1970-01-01
  • 1970-01-01
  • 2012-04-10
  • 1970-01-01
相关资源
最近更新 更多