0

フォト アルバムとして CarrierWave を使用しています。ユーザーがギャラリーに最大 5 枚の写真しかアップロードできないように設定しようとしています。ただし、「NoMethodError in PhotosController#create」というページ タイトルの [写真のアップロード] ボタンをクリックすると、「undefined method `user'」エラーが返されます。

写真.rb:

class Photo < ActiveRecord::Base
  attr_accessible :title, :body, :gallery_id, :name, :image, :remote_image_url
  belongs_to :gallery
  mount_uploader :image, ImageUploader

    LIMIT = 5

    validate do |record|
      record.validate_photo_quota
    end

    def validate_photo_quota
      return unless self.user
      if self.user.photos(:reload).count >= LIMIT
        errors.add(:base, :exceeded_quota)
      end
    end
end

Photos_controller:

class PhotosController < ApplicationController

  def new
    @photo = Photo.new(:gallery_id => params[:gallery_id])
  end

  def create
    @photo = Photo.new(params[:photo])
    if @photo.save
      flash[:notice] = "Successfully created photos."
      redirect_to @photo.gallery
    else
      render :action => 'new'
    end
end

  def edit
    @photo = Photo.find(params[:id])
  end

  def update
    @photo = Photo.find(params[:id])
    if @photo.update_attributes(paramas[:photo])
      flash[:notice] = "Successfully updated photo."
      redirect_to @photo.gallery
    else
      render :action => 'edit'
    end
  end

  def destroy
    @photo = Photo.find(params[:id])
    @photo.destroy
    flash[:notice] = "Successfully destroyed photo."
    redirect_to @photo.gallery
  end
end

すべてのコントローラーに対して行う必要がない限り、以前はユーザー定義があったと思いましたか?

4

1 に答える 1

2

モデルを呼び出しself.userています。Photoその場合のキーワードselfは、のインスタンスを表しますphoto。あなたの定義によれば、aはaphotoに属しているgalleryため、写真から呼び出されることはありませんuser

がユーザーに属している場合は、その写真のユーザー所有者を選択するgalleryために電話をかけることができるはずです。self.gallery.user


has_many :throughまた、その写真からユーザーに直接電話をかけたり、そのユーザーからすべての写真を取得したりできるように、関連付けを定義することもできます。

これは、ドキュメントに従って行うことができます。あなたの場合:

class User < ActiveRecord::Base
  has_many :galeries
  has_many :photos, :through => :galeries
end

class Photo < ActiveRecord::Base
  belongs_to :user, :through => :gallery
  belongs_to :gallery
end

class Gallery < ActiveRecord::Base
  belongs_to :user
  has_many :photos
end

photo.userその後、電話をかけて写真の所有者を取得できるはずです。

于 2013-03-19T13:58:08.803 に答える