4

音楽アルバムを編集するための比較的基本的なCRUDアプリケーションがあるとしましょう。私が持っているデータベースには:

id | album_name | artist  |  navigation

1    Lets Talk   Lagwagon    lets-talk

ただし、ページをalbums/1返すのではなく、ルートShowでページにアクセスできるようにしたい。albums/lets-talk

だから私のコントローラーには:

  def show
    @album = Album.find_by_navigation(params[:id])
  end

そして、私のインデックスビューでは、次のようになっています。

<%= link_to 'Show', :controller => "albums", :action => "show", :id => album.navigation %>

これはその機能を正常に実行しますが、Ruby APIは、私のlink_toメソッドが古く、代替をリストせずに古風であると言っているので、これを間違った方法で行っているのではないかと思います。

4

4 に答える 4

17

モデルでto_paramを定義します。

class album
    def to_param
        "#{id}-#{album-name.parameterize}"
     end
end

今、あなたは使用することができます

<%= link_to album.album_name, album %>

seoパスへのリンクを作成するには

次に、コントローラーで:

Album.find(params[:id])

->を呼び出すto_iので、Topic.find(2133)または何でも取得します。

これにより、次の形式のURLが生成されます: "/ album / 2-dark-side-of-the-moon"これは、正確には要求されたものには利点がありませんが、アルバムを見つけるためにIDが使用されます。名前はそうではないかもしれません。

parameterizeメソッド「文字列内の特殊文字を置き換えて、「きれいな」URLの一部として使用できるようにします」-http://api.rubyonrails.org/classes/ActiveSupport/Inflector.html#method-i-parameterize

于 2013-02-26T06:01:42.573 に答える
5

friend_idgemをチェックしてください。それはまさにあなたが必要とするものです。

于 2013-02-26T07:16:27.990 に答える
1

ブラウザでURLをとして表示したいapp/albums/lets-talkが、POSTパラメータをとして表示したい場合album_id => 1、ショッピングカートの追加など。

アルバムモデルの場合:

# PRODUCT MODEL
 before_create do
   self.navigation = album_name.downcase.gsub(" ", "-")  
  end

def to_param
    [id, album_name.parameterize].join("-")
end

今、あなたはすることができます

@album = Album.find_by_navigation(params[:id])

album = Album.find(params[:album_id])
于 2015-07-23T10:45:29.570 に答える
0

:idパラメータを:nameパラメータにオーバーライドしたいようです。この記事で説明されているこのケース。

class User < ActiveRecord::Base
  def to_param  # overridden
    name
  end
end

user = User.find_by_name('Phusion')
link_to 'Show', user_path(user)  # => <a href="/users/Phusion">Show</a>
于 2013-02-26T06:02:30.230 に答える