2016-08-31 21 views
0

我有一个RoR应用程序。而在应用程序用户可以创建帖子。我通过resources :posts连接了我的routes.rb中的Posts表。现在 - 链接到创建的帖子看起来像:http://mysitename.com/posts/1(其中1是帖子号码)。Rails,如何更改自动生成的链接

我想要做的是让rails生成链接到帖子。所以用户没有看到我的数据库中有多少帖子。结果它看起来像http://mysitename.com/post/generatedlink。它必须生成,例如帖子主题。

首先,我们必须在Posts表中创建link列。并使其产生类似的东西:

@post.link = @post.theme.parameterize.underscore 

但我不明白,在哪里把这段代码。

而接下来的问题是:“如何替换post/1@post.link?”

希望,我让自己清楚。如果您说我可以提供信息,那么需要解决我的问题。

UPDATE

我@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 %> 

和主网页(在那里我有职位名单)一个一直收到错误的:NoMethodError in Home#index private method 'to_param' called for #<Post:0x007fae3096bf78>

+0

也许看看这个宝石:https://github.com/norman/friendly_id然而,为了学习的目的,如何做到这一点没有宝石是值得的,因为它并不难实现。 –

+0

你不应该在你的模型定义的私人部分有'to_param'。我修改了我的答案以澄清这一点。 – SteveTurczyn

回答

3

该技术被称为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方法是如何构建url的post_path(@post) ...to_param如果未被替换,则替换id字段,但通过编写自己的to_param方法,可以确保替换slug字段。

确保'to_param'是一个公共方法!不要把它放在模型的私人部分。您可以通过在to_param方法之前立即放置public来完成此操作。如果后续方法是私有的,则应在方法定义之后放置private

+0

我明白了。好方法。但是,结果link_to标签现在工作不同。例如:它是'<%= link_to @post%>',但现在它的工作方式如下:'<%= link_to @ post.slug%>'(在我的应用程序中它@@ post.random_link')。可能是你可以帮我如何解决它? –

+0

不,你仍然可以通过to_param更改做'link_to @ post' – SteveTurczyn

+0

加入问题后出现什么问题 –