8144


例えば、Railsの`scaffold`で、Viewなどを作成した場合、次のようなコードが生成されるかと思われます。フォーム画面だったりすると:

[code]

    <%= form_for(@foobar) do |f| %>
    ....
    <% end %>
    
[/code]

であったり、あるいは

[code]

    <%= link_to 'Show', @foobar %>
    
[/code]

といったように。このテンプレートから、恐らく何らかの形で、モデルからパスを取得できるものである、っと推測が出来るように感じます。

しかし、この`Foobar`モデルが、`HogeHoge`モデルと関連するようになったため、当初URL構造を`/foobar/:id`から、`/hogehoge/:id/foobar/:id`といったURLにしたとします。

このとき、`@foobar`からアクセスすると、以前のまま`/foobar/:id`を生成してしまいます。仕方ないので、下のようにリンクを渡したりしています:

[code]

    <%= link_to 'Show', hogehoge_foobar_path(:hogehoge_id => @hogehoge.id, :id => @foobar.id) %>
    
[/code]

しかし、これはどう考えてもバットノウハウのように感じます。本来ならば、モデルインスタンスからURLを取得するほうが望ましいように感じます(要は`@foobar`から取得できるほうが望ましいように感じます)。

もし、モデルから取得されるURLを修正する方法について、何らかの参照するべきドキュメント、あるいは方法があれば教えてください。


CC BY-SA 3.0
2015-03-19T11:35:35.280
8129
2015-03-19T15:11:24.907
939
question
ruby ruby-on-rails
RailsでモデルのインスタンスからURLのパスを取得するときに、その取得するURLを変更する方法


BlogモデルとEntryモデルがあり、Blogでは`has_many :entries`、Entryでは`belong_to
:blog`という関係だとします。

`config/routes.rb` はこうします。

[code]

    Rails.application.routes.draw do
      resources :blogs do
        resources :entries
      end
    end
    
[/code]

ルーティングはこうなります

[code]

       blog_entries GET    /blogs/:blog_id/entries(.:format)          entries#index
                    POST   /blogs/:blog_id/entries(.:format)          entries#create
     new_blog_entry GET    /blogs/:blog_id/entries/new(.:format)      entries#new
    edit_blog_entry GET    /blogs/:blog_id/entries/:id/edit(.:format) entries#edit
         blog_entry GET    /blogs/:blog_id/entries/:id(.:format)      entries#show
                    PATCH  /blogs/:blog_id/entries/:id(.:format)      entries#update
                    PUT    /blogs/:blog_id/entries/:id(.:format)      entries#update
                    DELETE /blogs/:blog_id/entries/:id(.:format)      entries#destroy
    
[/code]

`link_to`メソッドはこんな風に呼び出すことになります。index.html.erbから抜粋しました。`@blog`はコントローラで`@blog=Blog.find(params[:blog_id])`しときましょう。

[code]

    <%= link_to 'Show', [@blog, entry] %>
    <%= link_to 'Edit', edit_blog_entry_path(@blog, entry) %>
    <%= link_to 'Destroy', [@blog, entry], method: :delete, data: { confirm: 'Are you sure?' } %>
    <%= link_to 'New Entry', new_blog_entry_path(@blog) %>
    
[/code]

`form_for`でも同じようにできます.

[code]

    <%= form_for([@blog, @entry]) do |f| %>
    
[/code]

詳しいことは"Nested Resource"をキーにしてドキュメントなどを読んでみてください


CC BY-SA 3.0
2015-03-19T13:50:02.560
8144
2015-03-19T15:11:24.907
2015-03-19T15:11:24.907
5793
5793
8129
answer