2012-07-16 4 views
0

J'ai une application fonctionnant bien sur Heroku et j'essaye de connecter l'application au service S3 d'Amazon avec Carrierwave. Je pensais que les fichiers de configuration fonctionnaient pour tout, mais je rencontre un problème lorsque je crée une image. Je pense que cela a à voir avec Postgres et une partie de sa mise en page spécifique, mais voici le problème principal.Postgres + Heroku Ruby Creation

Je reçois un TypeError (can't convert nil into String): sur ce qui semble être le POST à ​​la base de données (en particulier sur la méthode create). L'erreur se présente comme suit:

app/controllers/pictures_controller.rb:62:in `create' 

TypeError (can't convert nil into String): 
POST xxxxxxxx.herokuapp.com/684-536-025/pictures dyno=web.1 queue=0 wait=0ms service=510ms status=500 bytes=643 

Voici le début du POST ainsi:

#<Picture id: nil, description: nil, image: nil, gallery_id: 15, gallery_url_id: "a432b35_21cc", original_filename: "Sunflower.gif", order_number: nil, created_at: nil, updated_at: nil> 

Je suppose que la question ici est que Postgres ne permet pas à partir d'un POST quand il y a des champs c'est nul. Assez curieusement, sqlite ne me dérange pas, c'est pourquoi je suppose que le problème est Postgres et malheureusement, je vais utiliser Postgres pour la production. Je ne sais pas assez sur Postgres pour vraiment affiner ce problème, alors je me suis dit que je demanderais ici si je pouvais obtenir de l'aide/des conseils!

Merci!

EDIT: Voici la méthode de création d'une aide supplémentaire

def create 
# Creates a picture class instance based on the json objects being passed in from 
# Carrierwave 
p_attr = params[:picture] 
p_attr[:image] = params[:picture][:image].first if params[:picture][:image].class == Array 

# Gets the gallery vai the uuid gallery url 
@gallery = Gallery.where(:url_id => params[:url_id]).first 
# Builds the picture based on the attributes passed in above from the json 
@picture = @gallery.pictures.build(p_attr) 
# Assigns the gallery_url_id attribute 
@picture.gallery_url_id = @gallery.url_id 

puts @picture.inspect 

# Handle the picture save according to success or not 
LINE 62 -> if @picture.save 
    respond_to do |format| 
    format.html { 
     # Calls the method in the model to format the json repsonse 
     render :json => [@picture.to_jq_upload].to_json, 
     :content_type => 'text/html', 
     :layout => false 
    } 
    format.json { 
     render :json => [@picture.to_jq_upload].to_json 
    } 
    end 
else 
    render :json => [{:error => "custom_failure"}], :status => 304 
end 

fin

ligne 62 est marquée dans le code.

EDIT 2: Voici le modèle comme l'a demandé ...

class Picture < ActiveRecord::Base 

    # The attributes accesible via an @picture 
    attr_accessible :gallery_id, :description, :image, :gallery_url_id, :original_filename, :order_number 
    belongs_to :gallery 

    # Attatches the carrierwave uploader to the picture class 
    mount_uploader :image, ImageUploader 

    # Referenced when each picture is created, the json is formatted as the following form 
    def to_jq_upload 
    { 
     "name" => read_attribute(:image), 
     "size" => image.size, 
     "url" => image.url, 
     "thumbnail_url" => image.thumb.url, 
     "delete_url" => id, 
     "picture_id" => id, 
     "delete_type" => "DELETE", 
     "url_id" => read_attribute(:gallery_url_id), 
     "original_filename" => read_attribute(:original_filename), 
     "order_number" => "" 
    } 
    end 

end 
+0

quelle est exactement la ligne 62 dans votre contrôleur d'images et quel champ est nul provoquant l'erreur de type? app/controllers/pictures_controller.rb: 62: dans 'create ' – bento

+0

Je vais mettre à jour le post avec la méthode create, vu que cela pourrait aider. Il pourrait avoir à faire face à la recherche d'attribut si ... – user1470511

+0

Pouvons-nous voir un modèle de photo s'il vous plaît? – Andrei

Répondre

0

Je fini par utiliser ceci comme config/initilizers/fog.rb

CarrierWave.configure do |config| 
    config.fog_credentials = { 
    :provider    => 'AWS', 
    :aws_access_key_id  => 'asdf', 
    :aws_secret_access_key => 'asdfadsf', 
    :region     => 'us-east-1' 
    } 
    config.fog_directory = 'modea-design-comp-viewer' 
end 

En outre, dans le contrôleur I a dû définir manuellement les deux champs qui étaient comptabilisés en nil dans la base de données à une chaîne vide en tant que telle:

def create 
    # Creates a picture class instance based on the json objects being passed in from 
    # Carrierwave 
    p_attr = params[:picture] 
    p_attr[:image] = params[:picture][:image].first if params[:picture][:image].class == Array 

    # Gets the gallery vai the uuid gallery url 
    @gallery = Gallery.where(:url_id => params[:url_id]).first 
    # Builds the picture based on the attributes passed in above from the json 
    @picture = @gallery.pictures.build(p_attr) 
    # Assigns the gallery_url_id attribute 
    @picture.gallery_url_id = @gallery.url_id 

    @picture.order_number = "" 
    @picture.description = "" 

    # Handle the picture save according to success or not 
    if @picture.save 
     puts @picture.inspect 
     respond_to do |format| 
     format.html { 
      # Calls the method in the model to format the json repsonse 
      render :json => [@picture.to_jq_upload].to_json, 
      :content_type => 'text/html', 
      :layout => false 
     } 
     format.json { 
      render :json => [@picture.to_jq_upload].to_json 
     } 
     end 
    else 
     render :json => [{:error => "custom_failure"}], :status => 304 
    end 
    end 

qui ne pour moi!