2016-08-31 13 views
0

私はRoRアプリケーションを持っています。そして、アプリのユーザーは投稿を作成することができます。 resources :postsroutes.rbに投稿テーブルを接続しました。そして、今すぐ - 作成された投稿へのリンクはhttp://mysitename.com/posts/1のようになります(1は投稿番号です)。Rails、自動生成リンクの変更方法

私がしたいことは、レールが投稿するリンクを生成することです。だから、ユーザーは自分のDBにどれくらいの投稿があるのか​​分からなかった。結果としてhttp://mysitename.com/post/generatedlinkのように見える必要があります。それは、たとえば投稿テーマを生成する必要があります。

開始するには、投稿テーブルにlinkの列を作成する必要があります。

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

しかし、私はこのコードをどこに置くべきか分かりません。

さらに、「post/1@post.linkに置き換える方法は?」という問題があります。

希望、私は自分自身を明確にします。私が情報を提供できると言うなら、私の質問を解決するために何が必要です。私は@SteveTurczynのアドバイスの後にやった

UPDATE

としてrandom_linkという新しい列が作成されました。このようになり

resources :posts 

マイpost.rb(ポストモデル)::

私は私のroutes.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:NoMethodError in Home#index private method 'to_param' called for #<Post:0x007fae3096bf78>

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

とエラーになってキープ(私は記事のリストを持っている)メインページ

+0

おそらくこの宝石を見てください:https://github.com/norman/friendly_idしかし、それは実装するのが難しくないので、勉強のために宝石なしでこれを行う方法を理解する価値があります。 –

+0

モデル定義のプライベート部分に 'to_param'を置くべきではありません。私はそれを明確にするために私の答えを修正しました。 – SteveTurczyn

答えて

3

技術は

(1)あなたのposts表にslugと呼ばれる新しいフィールドを作成... slugifyingと呼ばれ、あなたは3つのことを行う必要があります。

(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'がパブリックメソッドであることを確認してください。あなたのモデルの私有部分には置かないでください。 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

質問に追加する問題が表示されます –

関連する問題