2011-09-18 27 views
7

Tôi đang sử dụng CarrierWave với Rails 3.1. Tôi nhận được thông báo lỗi sau khi tôi gửi biểu mẫu (cố gắng để tải lên một hình ảnh): Tin nhắnRails + CarrierWave: NoMethodError: phương thức undefined `name 'cho nil: NilClass

Lỗi:

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

Vấn đề là tôi không biết nơi name này xuất phát từ và Tôi không biết biến nào là nil, vì vậy tôi không thể gỡ lỗi đúng cách (tôi đã cố gỡ lỗi nhật ký trước khi yêu cầu tại đây). Dòng 18 tương ứng với dòng @post.save trong bộ điều khiển sau:

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 

# ... 

Đây file khác mà có thể là cần thiết để phát hiện các vấn đề:

Post (mô hình):

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> 

Vì vậy, những gì nó thực sự đi xin vui lòng?

+0

Mount_uploader chỉ nên là hình ảnh, phải không? Không phải image_url? – e3matheus

+0

@ e3matheus Cảm ơn rất nhiều! –

Trả lời

2

Hãy chắc chắn rằng bạn sử dụng - mount_uploader: hình ảnh, ImageUploader trong mô hình của bạn như ở đây -

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

Trân

Robbie

4

lớp hình ảnh tải lên của bạn chưa được nạp vào chủ đề máy chủ ray hiện tại của bạn . Tải lại máy chủ đường ray và nó sẽ hoạt động tốt =).

+0

Cảm ơn, tôi đã có cùng một triệu chứng và lớp người tải lên của tôi có lỗi trong đó ngăn không cho nó tải đúng cách. Quá xấu thông báo lỗi không tốt hơn. – mbillard

2

Tôi đã gặp phải một số sự cố và nguyên nhân là (có lẽ luôn luôn) rằng đối tượng UploadedFile đã được gửi đến thuộc tính carrierwave đã được gắn kết. Bộ điều hợp db không thể tuần tự hóa đối tượng này và do đó sẽ ném lỗi này.

Hãy chắc chắn rằng:

  • người tải lên đã đúng cách gắn kết
  • bạn không sử dụng write_attribute để ghi các file tải lên (đó là nguyên nhân của vấn đề của tôi). Sử dụng trình truy cập thay thế: model.send('image=', params[:model][:image]). Uglier, nhưng tốt hơn.
+0

Tôi đã sử dụng phương pháp tiện ích của riêng mình để gán thuộc tính, sử dụng cú pháp người dùng ['profile_photo'] và điều này tạo ra cùng một ngoại lệ. Sử dụng #send làm việc tốt. Tôi tự hỏi khi nào tôi có thể tìm thấy vấn đề mà bạn không đề cập đến điều này. Cảm ơn! –

1

Tôi đã xem qua bài đăng này vì tôi đã gặp lỗi tương tự như bạn đã mô tả, nhưng khởi động lại máy chủ không giải quyết được (như được các câu trả lời khác đề xuất).Trong trường hợp của tôi, vấn đề là do tôi đã sử dụng mount_uploadertrướcattr_accessible. Bằng cách chuyển đổi chúng tôi đã giải quyết được vấn đề.

0

Tôi gặp sự cố tương tự. Giải pháp đã được thay đổi:

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

tới:

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

Hãy chắc chắn rằng trong mô hình của bạn:

mount_uploader :image, ImageLoader 

Hãy nhớ rằng: hình ảnh phải kiểu chuỗi/văn bản.

Các vấn đề liên quan