2011-09-18 3 views
7

Sto utilizzando CarrierWave con Rails 3.1. Sto ottenendo il seguente messaggio di errore quando inviare il modulo (cercando di caricare un'immagine): MessaggioRails + CarrierWave: NoMethodError: metodo `nome 'non definito per nil: NilClass

Errore:

ActiveRecord::StatementInvalid in Admin::PostsController#create 

NoMethodError: undefined method `name' for nil:NilClass: INSERT INTO "posts" ("body", "created_at", "draft", "image", "post_type", "title", "updated_at", "user_id") VALUES (?, ?, ?, ?, ?, ?, ?, ?) 
Rails.root: /Users/aziz/Sandbox/ruby/rails/Tumblelog 

Application Trace | Framework Trace | Full Trace 
app/controllers/admin/posts_controller.rb:18:in `create' 
Request 

Parameters: 

{"utf8"=>"✓", 
"authenticity_token"=>"za+zNRDGNCcujnCmO726cWCo2ze1rgaXv5bL17JGaek=", 
"post"=>{"image"=>#<ActionDispatch::Http::UploadedFile:0x000001014aeff0 @original_filename="AzizLight.jpeg", 
@content_type="image/jpeg", 
@headers="Content-Disposition: form-data; name=\"post[image]\"; filename=\"AzizLight.jpeg\"\r\nContent-Type: image/jpeg\r\n", 
@tempfile=#<File:/var/folders/ky/2ddtbt0d7k1g__2ctr8njcfc0000gn/T/RackMultipart20110918-21704-hp2ajt>>, 
"draft"=>"0", 
"user_id"=>"2", 
"post_type"=>"image"}, 
"commit"=>"Post"} 

Il problema è che io non so dove questo name proviene e Non so quale variabile sia nil, quindi non riesco a eseguire il debug in modo corretto (ho provato a eseguire il debug di un registro prima di chiedere qui). Linea 18 corrisponde alla linea @post.save nella seguente controller:

PostsController:

# ... 

def new 
    @post = Post.new 
    @form_html_options = (params[:post_type] == "image") ? { :multipart => true } : {} 
    @form_partial = get_form_partial(params[:post_type]) 
    redirect_to admin_posts_path, :alert => "You tried to create an unknown type of post..." if @form_partial.nil? 
    @title = "Creating a new post..." 
end 

def create 
    @post = Post.new(params[:post]) 
    if @post.save 
    flash[:success] = "Post created successfully!" 
    redirect_to admin_post_path(@post) 
    else 
    @title = "Creating a new post..." 
    @form_partial = get_form_partial(params[:post][:post_type]) 
    render 'new' 
    end 
end 

# ... 

Ecco altri file che potrebbero essere necessari per individuare il problema:

Post (modello):

attr_accessible :title, :body, :user_id, :draft, :post_type, :image 

belongs_to :user 

mount_uploader :image_url, ImageUploader 

ImageUploader:

class ImageUploader < CarrierWave::Uploader::Base 
    include CarrierWave::RMagick 

    storage :fog 

    def extension_white_list 
    %w(jpg jpeg gif png) 
    end 
end 

new.html.erb:

<h1><%= @title %></h1> 

<%= form_for @post, :url => admin_posts_path, :html => @form_html_options do |f| %> 
    <%= render 'form', :f => f %> 
<% end %> 

_form.html.erb:

<%= render 'error_messages' %> 

<%= render @form_partial, :f => f %> 

<p class="drop-down"> 
    <%= f.label :draft, 'Status' %> 
    <%= f.select(:draft, options_for_select([["Published", 0], ["Draft", 1]], (@post.new_record? ? 0: @post.draft))) %> 
</p> 

<%= f.hidden_field :user_id, :value => @post.user_id || current_user.id %> 
<%= f.hidden_field :post_type, :value => @post.post_type || params[:post_type] %> 

<p class="button"><%= f.submit "Post", :disable_with => 'Posting...' %></p> 

_image_form.html.erb (@form_partial):

<p><%= f.file_field :image %></p> 

Così che cosa è realmente sta succedendo per favore?

+0

Il mount_uploader deve essere solo immagine, giusto? Non image_url? – e3matheus

+0

@ e3matheus Grazie mille! –

risposta

2

assicurarsi di utilizzare - mount_uploader: immagine, ImageUploader nel modello come qui -

class CarImage < ActiveRecord::Base 
    belongs_to :car 
    mount_uploader :image, ImageUploader 
end 

saluti

Robbie

4

La classe Image Uploader non è stato caricato sul suo thread del server binari d' . Reload rails server e dovrebbe funzionare bene =).

+0

Grazie, ho avuto lo stesso sintomo e la mia classe di uploader ha riscontrato degli errori che ne impedivano il corretto caricamento. Peccato che il messaggio di errore non sia migliore. – mbillard

2

Ho riscontrato un problema e la causa è (probabilmente sempre) che l'oggetto UploadedFile è stato inviato all'attributo carrierwave su cui è stato montato. L'adattatore db non può serializzare questo oggetto e quindi genera questo errore.

Assicurarsi che:

  • il caricamento è stato correttamente montato
  • non si utilizza write_attribute di scrivere il file caricato (che è stata la causa del mio problema). Utilizzare invece l'accessor: model.send('image=', params[:model][:image]). Uglier, ma meglio.
+0

Ho usato il mio metodo di utilità per assegnare l'attributo, che utilizzava la sintassi utente ['profile_photo'] e questo ha generato la stessa eccezione. L'uso di #send ha funzionato bene. Mi chiedo quando avrei trovato il problema senza che tu me ne accorgessi. Grazie! –

1

Mi sono imbattuto in questo post perché ho avuto lo stesso errore che hai descritto, ma il riavvio del server non è stato risolto (come suggerito da altre risposte).Nel mio caso, il problema è stato causato dal fatto che ho utilizzato mount_uploaderprima delattr_accessible. Passandoli ho risolto il problema.

0

Ho avuto un problema simile. Soluzione stava cambiando:

attr_accessible :title, :body, :user_id, :draft, :post_type, :image 
belongs_to :user 
mount_uploader :image_url, ImageUploader 

a:

attr_accessible :title, :body, :user_id, :draft, :post_type, :image_url 
belongs_to :user 
mount_uploader :image_url, ImageUploader 
2

Assicurarsi che nel modello:

mount_uploader :image, ImageLoader 

Ricordate che: immagine deve essere il tipo stringa/testo.