7

Rails 3.1 で CarrierWave を使用しています。フォームを送信すると (画像をアップロードしようとすると)、次のエラー メッセージが表示されます。

エラーメッセージ:

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

問題は、これがどこnameから来ているのかわからず、どの変数が nilになっているのかわからないため、適切にデバッグできないことです (ここで質問する前にログをデバッグしようとしました)。行 18@post.saveは、次のコントローラーの行に対応します。

投稿コントローラー:

# ...

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

# ...

問題を特定するために必要なその他のファイルを次に示します。

役職(モデル):

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

belongs_to :user

mount_uploader :image_url, 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>

それで、それは本当に何が起こっているのですか?

4

6 に答える 6

4

画像アップローダ クラスは、現在の Rails サーバー スレッドにロードされませんでした。Rails サーバーをリロードすると、正常に動作するはずです =)。

于 2011-11-14T07:59:33.290 に答える
2

私はいくつかの問題を経験しました、そして原因は(おそらく常に)UploadedFileオブジェクトがcarrierwaveがマウントされた属性に送信されたことです。dbアダプターはこのオブジェクトをシリアル化できないため、このエラーをスローします。

次のことを確認してください。

  • アップローダーが正しくマウントされている
  • write_attributeアップロードされたファイルの書き込みには使用しません(これが私の問題の原因でした)。代わりにアクセサを使用してください:model.send('image=', params[:model][:image])。醜いですが、より良いです。
于 2011-11-29T12:34:04.337 に答える
2

モデルで次のことを確認してください。

mount_uploader :image, ImageLoader

:image は文字列/テキスト型でなければならないことに注意してください。

于 2013-12-26T22:33:33.527 に答える
2

必ず使用してください - mount_uploader :image, ImageUploader のようにモデルで -

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

よろしく

ロビー

于 2011-10-10T13:25:36.790 に答える
1

あなたが説明したのと同じエラーが発生したため、この投稿に出くわしましたが、サーバーを再起動しても解決しませんでした(他の回答で示唆されているように)。私の場合、mount_uploader 以前 attr_accessibleに使用したために問題が発生しました。それらを切り替えることで問題を解決しました。

于 2013-01-26T22:01:02.437 に答える