0

Ma tentative consiste à créer une association polymorphe pour les modèles Items et Venues qui ont une association avec Photos. J'ai d'abord utilisé Rails Best Practices - How do you design your model for multiple upload? mais ont quelques erreurs, voici mon code jusqu'à présent:Association polymorphe dans Ruby on Rails

class Item < ActiveRecord::Base 
    has_many :photos, :as => :assetable, :class_name => "Item::Photo", :dependent => :destroy 
    accepts_nested_attributes_for :photos 

class Venue < ActiveRecord::Base 
    has_many :photos, :as => :assetable, :class_name => "Photo", :dependent => :destroy 
    accepts_nested_attributes_for :photos 

class Photo < ActiveRecord::Base 
    belongs_to :asset 
end 

class Asset < ActiveRecord::Base 
    has_many :photos 
    belongs_to :assetable, :polymorphic => true 
    delegate :url, :to => :attachment 
end 

class Venue::Photo < Asset 
    has_attached_file :attachment, 
    :styles => { 
     :large => "640x480", 
     :medium => "300x300", 
     :thumb => "100x100" 
    }, 
    :path => "/:style/:id/:filename" 
end 

class Item::Photo < Asset 
    has_attached_file :attachment, 
    :styles => { 
     :large => "640x480", 
     :medium => "300xa300", 
     :thumb => "100x100" 
    }, 
    :path => "/:style/:id/:filename" 

class VenuesController < ApplicationController 

# GET /venues 
# GET /venues.json 
def index 
    #@venues = Venue.all 
    params[:page] ||= 1 
    @venues = Venue.paginate(:page => params[:page]) 

    respond_to do |format| 
    format.html # index.html.erb 
    format.json { render json: @venues } 
    end 
end 

    # GET /venues/1 
    # GET /venues/1.json 
    def show 
    @venue = Venue.find(params[:id]) 

    respond_to do |format| 
     format.html # show.html.erb 
     format.json { render json: @venue } 
    end 
    end 

    # GET /venues/new 
    # GET /venues/new.json 
    def new 
    @venue = Venue.new 
    5.times do 
     @venue.assets.build 
    end 

    respond_to do |format| 
     format.html # new.html.erb 
     format.json { render json: @venue } 
    end 
    end 

    # GET /venues/1/edit 
    def edit 
    @venue = Venue.find(params[:id]) 
    5.times { @venue.assets.build } 
    end 

    # POST /venues 
    # POST /venues.json 
    def create 
    @venue = Venue.new(params[:venue]) 
    #@venue.tag_list ="asian, chinese" 

    respond_to do |format| 
     if @venue.save 
     format.html { redirect_to @venue, notice: 'Venue was successfully created.' } 
     format.json { render json: @venue, status: :created, location: @venue } 
     else 
     format.html { render action: "new" } 
     format.json { render json: @venue.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # PUT /venues/1 
    # PUT /venues/1.json 
    def update 
    @venue = Venue.find(params[:id]) 

    respond_to do |format| 
     if @venue.update_attributes(params[:venue]) 
     format.html { redirect_to @venue, notice: 'Venue was successfully updated.' } 
     format.json { head :no_content } 
     else 
     format.html { render action: "edit" } 
     format.json { render json: @venue.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # DELETE /venues/1 
    # DELETE /venues/1.json 
    def destroy 
    @venue = Venue.find(params[:id]) 
    @venue.destroy 

    respond_to do |format| 
     format.html { redirect_to venues_url } 
     format.json { head :no_content } 
    end 
    end 
end 

Le message d'erreur que je reçois le message d'erreur « attribut inconnu: assetable_id » lorsque je tente de modifier un lieu et « méthode non définie photos 'for nil: NilClass "lorsque j'essaie d'éditer un objet

+0

Que dit l'erreur? –

+0

@TerencePonce J'ai supprimé le modèle photo et je n'utilise que le modèle d'actif, donc maintenant je reçois le message d'erreur "Venue :: Photo" non initialisé lors de la tentative d'édition d'un lieu –

+0

Ce que je voulais dire, c'est que inclure la trace de la pile dans votre question? Il est assez difficile de déterminer la cause si nous n'avons pas de trace de pile pour continuer. –

Répondre

0

Avez-vous configuré la base de données comme indiqué dans le guide?

Pourquoi avez-vous défini le modèle photo et has_many :photos?

Si vous avez les mêmes styles pour les photos, vous n'avez pas besoin de STI.

+0

La base de données est comme indiqué dans le guide. Je vais supprimer le modèle et has_many: association de photos du modèle des actifs –

+0

vous n'avez pas besoin de photo modèle alors supprimez-le et travailler avec le modèle d'actif –

+0

J'ai enlevé la photo du modèle et je travaille maintenant avec l'actif du modèle. Je reçois un message d'erreur "constante non initialisée Venue :: Photo" lorsque j'essaie d'éditer le lieu –

Questions connexes