2016-08-31 70 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

加入問題後出現什麼問題 –