1

レールは初めてなので、これがどこかで議論されている場合は、私をリンクしてください:私は良い検索をしましたが、私が見つけたのは、このコメントの議論ではなく、link_toの使用方法を理解しようとしている人々だけでした:

link_to "Profile", profile_path(@profile)
# => <a href="/profiles/1">Profile</a>

in place of the older more verbose, non-resource-oriented

link_to "Profile", :controller => "profiles", :action => "show", :id => @profile
# => <a href="/profiles/show/1">Profile</a>

http://api.rubyonrails.org/classes/ActionView/Helpers/UrlHelper.html#method-i-link_to

後者はより冗長であり、したがって望ましくないことがわかりますが、前者はお勧めするのは奇妙なことのようです

たとえば、/ blah / addでアクションがあり、次のコマンドを使用してリンクしている場合:

link_to "Link", link_add_path

次に、mysite.com / link/addにリンクしています。これはハードコードされたURLです。

これがマップするルートを変更する場合は、コードベース内のlink_toのすべてのインスタンスを変更して、新しい絶対URLを指すようにする必要があります。これはおかしいようです。

ただし、次を使用してリンクすると、次のようになります。

link_to "Link", :controller => "thing", :action => "add"

次に、URLが動的に決定されます。パスを変更する必要がある場合は、config / routers.rbを編集するだけで、コードには触れません。これは、メンテナンスがはるかに少ないようです。

それよりも少し複雑であることに感謝します。blah_path変数は実際には静的ルートではなく、実際にはアプリケーションベースのURLのようないくつかのスマートが含まれており、存在しないURLにリンクすることはできませんが、わずかに冗長性の少ない構文を容易にします。

それで、どうしたの?

後者よりも前者のlink_to構文を選択する技術的な理由は何ですか?

4

2 に答える 2

3

「あなたはそれを間違っている」:P

真面目な話ですが、名前付きのリソースを使用してください。これがクールな理由です。

例:ルートファイルにこれがあります:

    resources :user_orders

そして、あなたはどこでも「user_orders_path」を使用しています。次に、リファクタリングを実行し、コントローラーを「注文」と呼びたいが、古いコードをすべて壊したくないと判断します(注文は一般的なものになっているため)。あなたはこれを行うことができます:

    resources :user_orders, controller: "orders"

そして、あなたの既存のリンクは引き続き機能します!(さらに、「注文」リソースを追加して、新しいスキームに移行することができます)

名前付きリンクのような素敵なものもあります:

    match 'exit' => 'sessions#destroy', :as => :logout

また、古いリンク構文を使用してコントローラーをリファクタリングする必要がある場合は、追加したいと思います。それでも、コントローラーリンクの山を変更する必要があります。

于 2012-08-26T03:22:30.670 に答える
0

次に、mysite.com / link/addにリンクしています。これはハードコードされたURLです。

いいえ、ちがいます。 link_add_pathRailsによって生成されたメソッドで、内の特定のルートを指しますconfig/routes.rb。あなたはこれを実行することで見ることができます

rake routes | grep link_add

これがマップするルートを変更する場合は、コードベース内のlink_toのすべてのインスタンスを変更して、新しい絶対URLを指すようにする必要があります。これはおかしいようです。

いいえ、しません。次の例を見てください

get "link/add", as: :link_add, controller: :links, action: :add

上記を実行した場合

rake routes | grep link_add

私は得る

link_add GET    /link/add(.:format)    links#add

しかし、コントローラーの名前をに変更するとどうなりUrisControllerますか?ルートを変更するだけですconfig/routes.rb

get "link/add", as: :link_add, controller: :uris, action: :add

そして今あなたは持っています

link_add GET    /link/add(.:format)    uris#add

ルート名が同じであるため、メソッドはまだmyで新しく変更された行にマップされているlink_toため、'sを変更する必要はありません。ごとにコントローラー/アクションを指定するより明確な方法では、すべてのリンクを調べて、新しいコントローラーを反映するように手動で更新する必要があります。link_add_path config/routes.rblink_tocontroller: :uris

レールガイドでルートの命名についてお読みください。

于 2012-08-26T03:16:28.457 に答える