質問編集履歴

2 追加でエラーが発生してしまいました

yamady

yamady score 177

2017/05/19 20:30  投稿

複数画像をcarrierwaveでアップロードすると同じものが参照されます(rails)
###前提・分からないこと
Ruby(RubyonRails)で食べログのような口コミサイト開発中です。
carrierwaveを使って、レストランページにて複数画像をアップロードしたいのですが、**なぜか一つの画像を参照**してしまいます。
アップロードは**active admin**から行なっています。
開発環境:Ruby on Rails 5.0.0.1
① それぞれ画像をアップロードしても...
![イメージ説明](05250efaf0091859811f701ddf2a80d3.png)
② 一つの画像だけが参照されてしまいます
![イメージ説明](ef16fa60efb80c1ef72430dea3a694de.png)
別件ではありますが、画像と紹介しているレストランと結びつけたいのですが、下記の部分を**アルバム名**で選択をできるようにしたいと考えています。
![イメージ説明](dac6ec60f1e9e08bc04898086003062d.png)
初歩的な質問ですみませんが、お助けくださいませ。
###該当するソースコード
アドミンのアルバム(app/admin/album.rb)
```Ruby
ActiveAdmin.register Album do
 permit_params :album_name, :image_1, :image_2, :image_3, :image_4, :image_5, :image_6, :image_7, :image_8, :image_9
 # See permitted parameters documentation:
 # https://github.com/activeadmin/activeadmin/blob/master/docs/2-resource-customization.md#setting-up-strong-parameters
 #
 # permit_params :list, :of, :attributes, :on, :model
 #
 # or
 #
 # permit_params do
 #  permitted = [:permitted, :attributes]
 #  permitted << :other if params[:action] == 'create' && current_user.admin?
 #  permitted
 # end
end
```
レストランのアドミン(app/admin/restaurant.rb)
```Ruby
ActiveAdmin.register Restaurant do
 permit_params :id, :name, :image, :genre, :access, :hour,
   :address, :phone, :website,
   :description, :seats, :area_id, :album_id, :mapaddress, :latitude, :longitude, albums_attributes: [:image]
 # See permitted parameters documentation:
 # https://github.com/activeadmin/activeadmin/blob/master/docs/2-resource-customization.md#setting-up-strong-parameters
 #
 # permit_params :list, :of, :attributes, :on, :model
 #
 # or
 #
 # permit_params do
 #  permitted = [:permitted, :attributes]
 #  permitted << :other if params[:action] == 'create' && current_user.admin?
 #  permitted
 # end
end
```
レストランのコントローラー(restaurant_controllers.rb)
```Ruby
class RestaurantsController < ApplicationController
・・・
 def new
   @restaurant = Restaurant.new(create_params)
   9.times { @restaurant.albums.build }
 end
 private
 def restaurant_params
   params.require(:restaurant).permit(:id, :name, :image, :genre, :access, :hour,
   :address, :phone, :website,
   :description, :seats, :area_id, :album_id, :mapaddress, :latitude, :longitude, albums_attributes: [:image])
 end
・・・
end
```
レストランのモデル(restaurant.rb)
```Ruby
class Restaurant < ApplicationRecord
 has_many :reviews
 belongs_to :area
 belongs_to :album
 mount_uploader :image, ImageUploader
 geocoded_by :mapaddress
 after_validation :geocode
end
```
アルバムのモデル(album.rb)
```Ruby
class Album < ApplicationRecord
 has_many :restaurants
 mount_uploader :image_1, ImageUploader
 mount_uploader :image_2, ImageUploader
 mount_uploader :image_3, ImageUploader
 mount_uploader :image_4, ImageUploader
 mount_uploader :image_5, ImageUploader
 mount_uploader :image_6, ImageUploader
 mount_uploader :image_7, ImageUploader
 mount_uploader :image_8, ImageUploader
 mount_uploader :image_9, ImageUploader
end
```
アルバムのマイグレーションファイル
```Ruby
class CreateAlbums < ActiveRecord::Migration[5.0]
 def change
   create_table :albums do |t|
     t.string :image_1
     t.string :image_2
     t.string :image_3
     t.string :image_4
     t.string :image_5
     t.string :image_6
     t.string :image_7
     t.string :image_8
     t.string :image_9
     t.timestamps
   end
 end
end
```
アルバムアップローダー
```Ruby
class AlbumUploader < CarrierWave::Uploader::Base
 # Include RMagick or MiniMagick support:
 # include CarrierWave::RMagick
 # include CarrierWave::MiniMagick
 # Choose what kind of storage to use for this uploader:
 storage :file
 # storage :fog
 # Override the directory where uploaded files will be stored.
 # This is a sensible default for uploaders that are meant to be mounted:
 def store_dir
   "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
 end
 # Provide a default URL as a default if there hasn't been a file uploaded:
 # def default_url(*args)
 #  # For Rails 3.1+ asset pipeline compatibility:
 #  # ActionController::Base.helpers.asset_path("fallback/" + [version_name, "default.png"].compact.join('_'))
 #
 #  "/images/fallback/" + [version_name, "default.png"].compact.join('_')
 # end
 # Process files as they are uploaded:
 # process scale: [200, 300]
 #
 # def scale(width, height)
 #  # do something
 # end
 # Create different versions of your uploaded files:
 # version :thumb do
 #  process resize_to_fit: [50, 50]
 # end
 # Add a white list of extensions which are allowed to be uploaded.
 # For images you might use something like this:
 # def extension_whitelist
 #  %w(jpg jpeg gif png)
 # end
 # Override the filename of the uploaded files:
 # Avoid using model.id or version_name here, see uploader/store.rb for details.
 # def filename
 #  "something.jpg" if original_filename
 # end
end
```
```
###追記でエラーが発生しました
いただいた通り、albumの下に入れ子を作ってみるとかなり複雑っぽくなってしまい、多々エラーが発生してしまいました。。泣
まず、直したいところは下記2点です。
・active admin上で、アルバムとレストランを紐付けたい
現在はアルバムを選択する項目が消えてしまいました。。下記はレストランを入力するフォームです。
![イメージ説明](a0fb4e8ea9ad20734d55b71348b78d56.png)
active_admin側はgemで
・アルバムの画像を表示させるエラーが出てしまいます
NoMethodErrorとなってしまい、ビューの書き方に問題があるかと考えられます。
・active admin上でアルバムを入力するビューになぜか、アルバムIDが不明に2つ出ています。
![イメージ説明](5ebb4743cd51ca453acfb3aeb05915e6.png)
ビュー
```Ruby
   <!-- Wrapper for slides -->
   <div class="carousel-inner" role="listbox">
     <div class="item active">
       <%= image_tag @restaurant.image %>
     </div>
     <div class="item restaurant-image">
       <%= image_tag @restaurant.album.image_1 %>
     </div>
     <div class="item restaurant-image">
       <%= image_tag @restaurant.album.image_2 %>
     </div>
     <div class="item restaurant-image">
       <%= image_tag @restaurant.album.image_3 %>
     </div>
     <div class="item restaurant-image">
       <%= image_tag @restaurant.album.image_4 %>
     </div>
     <div class="item restaurant-image">
       <%= image_tag @restaurant.album.image_5 %>
     </div>
     <div class="item restaurant-image">
       <%= image_tag @restaurant.album.image_6 %>
     </div>
   </div>
```
**■ レストラン側のコード**
・レストランのモデル
```Ruby
class Restaurant < ApplicationRecord
 belongs_to :area
 has_many :album
 mount_uploader :image, ImageUploader
 geocoded_by :mapaddress
 after_validation :geocode
end
```
・レストランのコントローラー(restaurant_controllers.rb)
```Ruby
class RestaurantsController < ApplicationController
・・・
 def restaurant_params
   params.require(:restaurant).permit(:id, :name, :image, :genre, :access, :hour,
   :address, :phone, :website,
   :description, :seats, :area_id, :album_id, :mapaddress, :latitude, :longitude, albums_attributes: [:image])
 end
・・・
end
```
・レストランとアルバムを紐付けるマイグレーションファイル
日付_album_id_to_restaurants.rb
```Ruby
class AlbumIdToRestaurants < ActiveRecord::Migration[5.0]
 def self.up
   add_column :restaurants, :album_id, :integer
   add_index :restaurants, :album_id
 end
 def self.down
   remove_index :restaurants, :column => :album_id
   remove_column :restaurants, :album_id
 end
end
```
**■ アルバム側のコード**
・アルバムのモデル
```Ruby
class Album < ApplicationRecord
 belongs_to :restaurant
 has_many :album_contents
 accepts_nested_attributes_for :album_contents
end
```
・アルバムのコントローラー
```Ruby
class AlbumController < ApplicationController
 def new
   @album = Album.new(create_params)
   9.times { @album.album_contents.build }
 end
 private
 def create_params
   params.require(:album).permit(album_contents_attributes: [:image])
 end
end
```
・アルバムのマイグレーションファイル
```Ruby
class CreateAlbums < ActiveRecord::Migration[5.0]
 def change
   create_table :albums do |t|
     t.integer :restaurant_id
     t.timestamps
   end
 end
end
```
・アルバムの入れ子となるアルバムコンテンツのモデル
```Ruby
class AlbumContent < ApplicationRecord
 belongs_to :album
 mount_uploader :image_1, AlbumContentUploader
 mount_uploader :image_2, AlbumContentUploader
 mount_uploader :image_3, AlbumContentUploader
 mount_uploader :image_4, AlbumContentUploader
 mount_uploader :image_5, AlbumContentUploader
 mount_uploader :image_6, AlbumContentUploader
 mount_uploader :image_7, AlbumContentUploader
 mount_uploader :image_8, AlbumContentUploader
 mount_uploader :image_9, AlbumContentUploader
end
```
・アルバムコンテンツのマイグレーションファイル
```Ruby
class CreateAlbumContents < ActiveRecord::Migration[5.0]
 def change
   create_table :album_contents do |t|
     t.integer :album_id
     t.string :image_1
     t.string :image_2
     t.string :image_3
     t.string :image_4
     t.string :image_5
     t.string :image_6
     t.string :image_7
     t.string :image_8
     t.string :image_9
     t.timestamps
   end
 end
end
```
・アルバムとアルバムコンテンツを紐付けるマイグレーションファイル
```Ruby
class AddAlbumRefToAlbumContent < ActiveRecord::Migration[5.0]
 def change
   add_column :album_contents, :album, :refernces
 end
end
```
いろいろ反省しかありません。。
すみませんが、おたすけくださいませ。
  • Ruby

    17958 questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

  • Ruby on Rails

    19726 questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

1 Railsのバージョンを間違えました

yamady

yamady score 177

2017/05/19 12:49  投稿

複数画像をcarrierwaveでアップロードすると同じものが参照されます(rails)
###前提・分からないこと
Ruby(RubyonRails)で食べログのような口コミサイト開発中です。
carrierwaveを使って、レストランページにて複数画像をアップロードしたいのですが、**なぜか一つの画像を参照**してしまいます。
アップロードは**active admin**から行なっています。
開発環境:Ruby on Rails 5.0.0.2
開発環境:Ruby on Rails 5.0.0.1
① それぞれ画像をアップロードしても...
![イメージ説明](05250efaf0091859811f701ddf2a80d3.png)
② 一つの画像だけが参照されてしまいます
![イメージ説明](ef16fa60efb80c1ef72430dea3a694de.png)
別件ではありますが、画像と紹介しているレストランと結びつけたいのですが、下記の部分を**アルバム名**で選択をできるようにしたいと考えています。
![イメージ説明](dac6ec60f1e9e08bc04898086003062d.png)
初歩的な質問ですみませんが、お助けくださいませ。
###該当するソースコード
アドミンのアルバム(app/admin/album.rb)
```Ruby
ActiveAdmin.register Album do
 permit_params :album_name, :image_1, :image_2, :image_3, :image_4, :image_5, :image_6, :image_7, :image_8, :image_9
 # See permitted parameters documentation:
 # https://github.com/activeadmin/activeadmin/blob/master/docs/2-resource-customization.md#setting-up-strong-parameters
 #
 # permit_params :list, :of, :attributes, :on, :model
 #
 # or
 #
 # permit_params do
 #  permitted = [:permitted, :attributes]
 #  permitted << :other if params[:action] == 'create' && current_user.admin?
 #  permitted
 # end
end
```
レストランのアドミン(app/admin/restaurant.rb)
```Ruby
ActiveAdmin.register Restaurant do
 permit_params :id, :name, :image, :genre, :access, :hour,
   :address, :phone, :website,
   :description, :seats, :area_id, :album_id, :mapaddress, :latitude, :longitude, albums_attributes: [:image]
 # See permitted parameters documentation:
 # https://github.com/activeadmin/activeadmin/blob/master/docs/2-resource-customization.md#setting-up-strong-parameters
 #
 # permit_params :list, :of, :attributes, :on, :model
 #
 # or
 #
 # permit_params do
 #  permitted = [:permitted, :attributes]
 #  permitted << :other if params[:action] == 'create' && current_user.admin?
 #  permitted
 # end
end
```
レストランのコントローラー(restaurant_controllers.rb)
```Ruby
class RestaurantsController < ApplicationController
・・・
 def new
   @restaurant = Restaurant.new(create_params)
   9.times { @restaurant.albums.build }
 end
 private
 def restaurant_params
   params.require(:restaurant).permit(:id, :name, :image, :genre, :access, :hour,
   :address, :phone, :website,
   :description, :seats, :area_id, :album_id, :mapaddress, :latitude, :longitude, albums_attributes: [:image])
 end
・・・
end
```
レストランのモデル(restaurant.rb)
```Ruby
class Restaurant < ApplicationRecord
 has_many :reviews
 belongs_to :area
 belongs_to :album
 mount_uploader :image, ImageUploader
 geocoded_by :mapaddress
 after_validation :geocode
end
```
アルバムのモデル(album.rb)
```Ruby
class Album < ApplicationRecord
 has_many :restaurants
 mount_uploader :image_1, ImageUploader
 mount_uploader :image_2, ImageUploader
 mount_uploader :image_3, ImageUploader
 mount_uploader :image_4, ImageUploader
 mount_uploader :image_5, ImageUploader
 mount_uploader :image_6, ImageUploader
 mount_uploader :image_7, ImageUploader
 mount_uploader :image_8, ImageUploader
 mount_uploader :image_9, ImageUploader
end
```
アルバムのマイグレーションファイル
```Ruby
class CreateAlbums < ActiveRecord::Migration[5.0]
 def change
   create_table :albums do |t|
     t.string :image_1
     t.string :image_2
     t.string :image_3
     t.string :image_4
     t.string :image_5
     t.string :image_6
     t.string :image_7
     t.string :image_8
     t.string :image_9
     t.timestamps
   end
 end
end
```
アルバムアップローダー
```Ruby
class AlbumUploader < CarrierWave::Uploader::Base
 # Include RMagick or MiniMagick support:
 # include CarrierWave::RMagick
 # include CarrierWave::MiniMagick
 # Choose what kind of storage to use for this uploader:
 storage :file
 # storage :fog
 # Override the directory where uploaded files will be stored.
 # This is a sensible default for uploaders that are meant to be mounted:
 def store_dir
   "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
 end
 # Provide a default URL as a default if there hasn't been a file uploaded:
 # def default_url(*args)
 #  # For Rails 3.1+ asset pipeline compatibility:
 #  # ActionController::Base.helpers.asset_path("fallback/" + [version_name, "default.png"].compact.join('_'))
 #
 #  "/images/fallback/" + [version_name, "default.png"].compact.join('_')
 # end
 # Process files as they are uploaded:
 # process scale: [200, 300]
 #
 # def scale(width, height)
 #  # do something
 # end
 # Create different versions of your uploaded files:
 # version :thumb do
 #  process resize_to_fit: [50, 50]
 # end
 # Add a white list of extensions which are allowed to be uploaded.
 # For images you might use something like this:
 # def extension_whitelist
 #  %w(jpg jpeg gif png)
 # end
 # Override the filename of the uploaded files:
 # Avoid using model.id or version_name here, see uploader/store.rb for details.
 # def filename
 #  "something.jpg" if original_filename
 # end
end
```
  • Ruby

    17958 questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

  • Ruby on Rails

    19726 questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る