Schienen + CarrierWave: NoMethodError: undefined method `name' for nil:NilClass
Ich bin mit CarrierWave mit Rails 3.1. Ich erhalte die folgende Fehlermeldung, wenn ich das Formular abschicken (der Versuch ein Bild hochzuladen):
Fehlermeldung:
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"}
Das problem ist, dass ich nicht weiß, wo diese name
kommt und ich weiß nicht, was variable wird null, so kann ich nicht richtig Debuggen (ich habe versucht, zu Debuggen ein Protokoll vor der Frage hier).
Zeile 18 entspricht der @post.save
Zeile in der folgenden 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
# ...
Hier andere Dateien, die benötigt werden könnten, um vor Ort das problem:
Post (Modell):
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
neu.html-Code.erb:
<h1><%= @title %></h1>
<%= form_for @post, :url => admin_posts_path, :html => @form_html_options do |f| %>
<%= render 'form', :f => f %>
<% end %>
_form.html-Code.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-Code.erb (@form_partial
):
<p><%= f.file_field :image %></p>
Also was wirklich Los ist, bitte?
- Die mount_uploader soll nur das Bild, richtig? Nicht Image: URL?
- Vielen Dank!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre Bild-uploader-Klasse wurde nicht geladen werden in Ihren aktuellen rails-server thread. Reload rails server und es sollte funktionieren =).
Stellen Sie sicher, dass Sie verwenden - mount_uploader :Bild, ImageUploader in Ihrem Modell wie hier -
Hinsichtlich
Robbie
Erlebte ich das einige problem und die Ursache ist (wahrscheinlich immer), dass die UploadedFile Objekt wurde an das Attribut carrierwave montiert war. Der db-adapter kann nicht serialisiert das Objekt und wird daher diesen Fehler auslösen.
Stellen Sie sicher, dass:
write_attribute
zu schreiben, die hochgeladene Datei (das war die Ursache für mein problem). Verwenden Sie die accessor statt:model.send('image=', params[:model][:image])
. Hässlicher, aber besser.Stellen Sie sicher, dass in Ihrem Modell:
Denken Sie daran, dass :das Bild muss den string/text.
Stieß ich auf dieses post, weil ich hatte den gleichen Fehler, die Sie beschrieben, aber ein Neustart des Servers nicht auflösen (wie vorgeschlagen, durch die anderen Antworten). In meinem Fall war das problem verursacht, weil ich
mount_uploader
vorattr_accessible
. Durch den Wechsel ich das problem gelöst.Ich hatte ein ähnliches problem.
Die Lösung wurde verändert:
zu: