0

写真アルバムのウェブアプリを作ろうとしています。ユーザー、アルバム、写真の 3 つのモデルがあります。

構成/ルート

Pholder::Application.routes.draw do
resources :users do
  resources :albums do
    resources :photos
  end
end

Album#show の URL でわかるように、ユーザーを作成し、ユーザーの下にアルバムを作成することができました。

http://localhost:3000/users/20/albums/94(問題なし)

ただし、そのページでは、すべてユーザーの下にあるアルバムの下に写真を作成するためのリンクを作成したいと考えています (/users/20/albums/94/photos/new のような URL を持つもの) rake routes。パスがありnew_album_photoます。これは私のアルバム/ショー ビューです

show.html.erb

<% if @album.photos.any? %>
yes  pics
<% else %>
no  pics
<% end %>


<%= link_to "Upload new pics!", new_album_photo_path(@album) %>

ただし、それをクリックすると、2 つの問題が発生します。

  1. 次のエラーが表示されます。No route matches [GET] "/albums/94/photos/new"
  2. URL に user_id が含まれていません... http://localhost:3000/albums/94/photos/new. 私のモデルがこれを引き起こしている可能性があります(私のモデルによれば、アルバムは複数のユーザーによって所有されているためですか?結合テーブルを削除してAlbumモデルを結合テーブルにする必要があるかどうかはわかりません(おそらく結合テーブルが原因です) ?)

これは私のモデルのせいでしょうか?または、ルートヘルパーで間違ったパラメーターを渡していますか?

ここに私のモデルがあります。モデル:

class User < ActiveRecord::Base

  has_secure_password
  attr_accessible :email, :name, :password, :password_confirmation
  validates_presence_of :password, :on => :create

  validates_format_of :name, :with => /[A-Za-z]+/, :on => :create
  validates_format_of :email, :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i, :on => :create
  validates_length_of :password, :minimum => 5, :on => :create

  has_many :album_user
  has_many :albums, :through => :album_user
  accepts_nested_attributes_for :albums

end


class AlbumUser < ActiveRecord::Base
  belongs_to :album
  belongs_to :user
end


class Album < ActiveRecord::Base
  attr_accessible :avatar, :name, :description
  has_many :album_user
  has_many :users, :through => :album_user
  has_many :photos
end


class Photo < ActiveRecord::Base
  belongs_to :album
end

ルート

     user_albums GET    /users/:user_id/albums(.:format)            albums#index
                 POST   /users/:user_id/albums(.:format)            albums#create
  new_user_album GET    /users/:user_id/albums/new(.:format)        albums#new
 edit_user_album GET    /users/:user_id/albums/:id/edit(.:format)   albums#edit
      user_album GET    /users/:user_id/albums/:id(.:format)        albums#show
                 PUT    /users/:user_id/albums/:id(.:format)        albums#update
                 DELETE /users/:user_id/albums/:id(.:format)        albums#destroy
           users GET    /users(.:format)                            users#index
                 POST   /users(.:format)                            users#create
    new_user GET    /users/new(.:format)                        users#new
       edit_user GET    /users/:id/edit(.:format)                   users#edit
            user GET    /users/:id(.:format)                        users#show
                 PUT    /users/:id(.:format)                        users#update
                 DELETE /users/:id(.:format)                        users#destroy
    album_photos GET    /albums/:album_id/photos(.:format)          photos#index
                 POST   /albums/:album_id/photos(.:format)          photos#create
 new_album_photo GET    /albums/:album_id/photos/new(.:format)      photos#new
edit_album_photo GET    /albums/:album_id/photos/:id/edit(.:format) photos#edit
     album_photo GET    /albums/:album_id/photos/:id(.:format)      photos#show
                 PUT    /albums/:album_id/photos/:id(.:format)      photos#update
                 DELETE /albums/:album_id/photos/:id(.:format)      photos#destroy
          albums GET    /albums(.:format)                           albums#index
                 POST   /albums(.:format)                           albums#create
       new_album GET    /albums/new(.:format)                       albums#new
      edit_album GET    /albums/:id/edit(.:format)                  albums#edit
           album GET    /albums/:id(.:format)                       albums#show
                 PUT    /albums/:id(.:format)                       albums#update
                 DELETE /albums/:id(.:format)                       albums#destroy
            root        /                                           users#index
           about        /about(.:format)                            home#about
            help        /help(.:format)                             home#help
         contact        /contact(.:format)                          home#contact

さらにファイルが必要な場合はお知らせください。

4

1 に答える 1

1

ファイルroutes.rbは次のようになります(追加end):

Pholder::Application.routes.draw do

  resources :users do
    resources :albums do
      resources :photos
    end
  end

end

album.rbこのようにする必要があります(で:album_usersはありません:album_user):

class Album < ActiveRecord::Base
  has_many :album_users
  has_many :users, :through => :album_users
  has_many :photos
end

user.rbこのようにする必要があります(で:album_usersはありません:album_user)。この方法で写真の関係を追加できます。

class User < ActiveRecord::Base
  has_many :album_users
  has_many :albums, :through => :album_users
  has_many :photos, :finder_sql =>  proc {"select * from photos inner join albums on albums.id = photos.album_id inner join album_users on album_users.album_id = albums.id where album_users.user_id = #{id}"}

  accepts_nested_attributes_for :albums
end

あなたはあなたの中に見て、このようにそれを使うべきnew_user_album_photoですroutes.rb

new_user_album_photo_path(@user, @album)

次のように、コンソールでルートをテストできます。

app.new_user_album_photo_path(User.first, Album.first)

戻るはずです:

=> "/users/1/albums/1/photos/new"
于 2012-10-03T04:02:57.973 に答える