クリップ:「欠落」画像

paperclip ruby-on-rails ruby-on-rails-3 ruby-on-rails-plugins
クリップ:「欠落」画像

私は、ベッドアンドブレックファーストのビジネスを営む人々が宿泊施設を投稿できるウェブサイトに取り組んでいます。

宿泊施設の「プロフィール画像」を掲載する際にそれらを含めるよう要求しますが、後で画像を追加するオプションも提供したいと思います(これは後に開発されます)。

私は、Paperclip gemを使用し、アプリケーションに宿泊施設と写真を用意することをお勧めします。後者は最初のものに関連付けられています。

宿泊施設を作成すると、新しい写真レコードが作成されます。 id属性とaccommodation_id属性の両方があります。 ただし、画像はアップロードされず、Paperclip属性は設定されません(image_file_name:nil、image_content_type:nil、image_file_size:nil)。したがって、Paperclipの「欠落」写真が表示されます。

これについて何かアイデアはありますか? 数日の間、私は動けなくなっていました。

宿泊施設

  • 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
end
  • views / accommodations / _form.html.erb *

<%= form_for @accommodation, :html => {:multipart => true} do |f| %>
  <%= f.error_messages %>

    Title

    <%= f.text_field :title, :size => 60 %>


    Description

    <%= f.text_area :description, :rows => 17, :cols => 75, :class => "mceEditor" %>


    Photo

    <%= f.file_field :photo %>

  [... snip ...]
 <%= f.submit %>
<% end %>

写真

コントローラーとビューは、Railsが生成したときと同じです。

  • 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

  3  0


ベストアンサー

ペーパークリップを使用してアップロードを作成するには、定義したモデルで、 `has_attached_file`行に指定した名前を使用する必要があります。 あなたの場合、これはこのビューコードになります:

<%= form_for @accommodation, :html => { :multipart => true } do |f| %>
  <%= f.fields_for :photo do |photo_fields| %>

      Photo

      <%= photo_fields.file_field :image %>

  <% end %>
<% end %>

コントローラで:

class AccommodationsController < ApplicationController

  # also protect create and update actions!
  before_filter :login_required, :only => [ :new, :create, :edit, :update ]

  def new
    # always make objects through their owner
    @accommodation = current_user.accommodations.build
    @accommodation.build_photo
  end

  def create
    @accommodation = current_user.accommodations.build(params[:accommodation])
    if @accommodation.save
       # always redirect after successful save/update
       redirect_to @accommodation
    else
       render :new
    end
  end
end

ネストされたフォームを処理するようにRailsに指示します。

class Accommodation
  has_one :photo
  accepts_nested_attributes :photo
  attr_accessible :photo_attributes, :title, :description, :etc
end

そして、写真モデルでアクセス可能な属性を設定してください:

class Photo
  attr_accessible :image # individual attributes such as image_file_name shouldn't be accessible
  has_attached_file :image, :styles => "etc"
end

ログファイルを見て、 `attr_accessible`によって保護されているがまだフォームにあるものを見つけてください。

2


タイトルとURLをコピーしました