Paperclip: "missing" image when uses has_one

Posted by EricR on Stack Overflow See other posts from Stack Overflow or by EricR
Published on 2010-12-21T22:51:27Z Indexed on 2010/12/21 22:54 UTC
Read the original article Hit count: 246

Filed under:
|

I'm working on a website that allows people who run bed and breakfast businesses to post their accommodations.

I would like to require that they include a "profile image" of the accommodation when they post it, but I also want to give them the option to add more images later (this will be developed after).

I thought the best thing to do would be to use the Paperclip gem and have a Accommodation and a Photo in my application, the later belonging to the first as an association.

A new Photo record is created when they create an Accommodation. It has both id and accommodation_id attributes. However, the image is never uploaded and none of the Paperclip attributes get set (image_file_name: nil, image_content_type: nil, image_file_size: nil), so I get Paperclip's "missing" photo.

Any ideas on this one? It's been keeping me stuck for a few days now.

Accommodation

models/accommodation.rb

class Accommodation < ActiveRecord::Base
  validates_presence_of :title, :description, :photo, :thing, :location
  attr_accessible :title, :description, :thing, :borough, :location, :spaces, :price
  has_one :photo
end

controllers/accommodation_controller.erb

class AccommodationsController < ApplicationController

  before_filter :login_required, :only => {:new, :edit}

  uses_tiny_mce ( :options => {
    :theme => 'advanced',
    :theme_advanced_toolbar_location => 'top',
    :theme_advanced_toolbar_align => 'left',
    :theme_advanced_buttons1 => 'bold,italic,underline,bullist,numlist,separator,undo,redo',
    :theme_advanced_buttons2 => '',
    :theme_advanced_buttons3 => ''
  })

  def index
    @accommodations = Accommodation.all
  end

  def show
    @accommodation = Accommodation.find(params[:id])
  end

  def new
    @accommodation = Accommodation.new
  end

  def create
    @accommodation = Accommodation.new(params[:accommodation])
    @accommodation.photo = Photo.new(params[:photo])
    @accommodation.user_id = current_user.id
    if @accommodation.save
      flash[:notice] = "Successfully created your accommodation."
      render :action => 'show'
    else
      render :action => 'new'
    end
  end

  def edit
    @accommodation = Accommodation.find(params[:id])
  end

  def update
    @accommodation = Accommodation.find(params[:id])
    if @accommodation.update_attributes(params[:accommodation])
      flash[:notice] = "Successfully updated accommodation."
      render :action => 'show'
    else
      render :action => 'edit'
    end
  end

  def destroy
    @accommodation = Accommodation.find(params[:id])
    @accommodation.destroy
    flash[:notice] = "Successfully destroyed accommodation."
    redirect_to :inkeep
  end

  private

  def check_owner
  end

end

views/accommodations/_form.html.erb

<%= form_for @accommodation, :html => {:multipart => true} do |f| %>
  <%= f.error_messages %>
  <p>
    Title<br />
    <%= f.text_field :title, :size => 60 %>
  </p>
  <p>
    Description<br />
    <%= f.text_area :description, :rows => 17, :cols => 75, :class => "mceEditor" %>
  </p>
  <p>
    Photo<br />
    <%= f.file_field :photo %>
  </p>
  [... snip ...]
 <p><%= f.submit %></p>
<% end %>

Photo

The controller and views are still the same as when Rails generated them.

models/photo.erb

class Photo < ActiveRecord::Base
  attr_accessible :image_file_name, :image_content_type, :image_file_size
  belongs_to :accommodation
  has_attached_file :image,
    :styles => {
      :thumb=> "100x100#",
      :small  => "150x150>" }
end

© Stack Overflow or respective owner

Related posts about ruby-on-rails

Related posts about paperclip