2011-09-18 21 views
7

Estoy usando CarrierWave con Rails 3.1. Estoy recibiendo el mensaje de error siguiente cuando envíe el formulario (tratando de subir una imagen): MensajeRails + CarrierWave: NoMethodError: método undefined `name 'para nil: NilClass

error:

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"} 

El problema es que no sé donde esto proviene de name y No sé qué variable es nula, por lo que no puedo depurar correctamente (intenté depurar un registro antes de preguntar aquí). La línea 18 corresponde a la línea @post.save en el siguiente controlador:

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 

# ... 

Aquí otros archivos que podrían ser necesarios para detectar el problema:

Post (modelo):

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> 

Así que lo que realmente pasando por favor?

+0

El mount_uploader debería ser solo imagen, ¿verdad? ¿No image_url? – e3matheus

+0

@ e3matheus ¡Muchas gracias! –

Respuesta

2

asegúrese de usar - mount_uploader: Imagen, ImageUploader en su modelo como aquí -

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

Saludos

Robbie

4

Su clase Image Uploader no se cargó en el hilo del servidor carriles actuales . Recargue el servidor de rieles y debería funcionar bien =).

+0

Gracias, tuve el mismo síntoma y mi clase de cargadores tuvo errores que impidieron que se cargara correctamente. Lástima que el mensaje de error no sea mejor. – mbillard

2

Experimenté un problema y la causa es (probablemente siempre) que el objeto UploadedFile se haya enviado al atributo carrierwave en el que se montó. El adaptador de db no puede serializar este objeto y, por lo tanto, lanzará este error.

Asegúrese de que:

  • el cargador ha sido correctamente montada
  • no utiliza write_attribute para escribir el archivo cargado (que fue la causa de mi problema). Utilice el descriptor de acceso en su lugar: model.send('image=', params[:model][:image]). Uglier, pero mejor.
+0

Utilicé mi propio método de utilidad para asignar el atributo, que usaba la sintaxis del usuario ['profile_photo'] y esto generó la misma excepción. Usar #send funcionó bien. Me pregunto cuándo habría encontrado el problema sin mencionar esto. ¡Gracias! –

1

Me encontré con esta publicación porque tuve el mismo error que usted describió, pero reiniciar el servidor no lo resolvió (como lo sugieren otras respuestas).En mi caso, el problema fue causado porque usé mount_uploaderantes deattr_accessible. Al cambiarlos resolví el problema.

0

Tuve un problema similar. Solución estaba 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

Asegúrese de que en su modelo:

mount_uploader :image, ImageLoader 

Recuerde que: la imagen debe ser del tipo de cadena/texto.

Cuestiones relacionadas