ruby-on-rails - 回形针: "missing"图片

标签 ruby-on-rails ruby-on-rails-plugins paperclip ruby-on-rails-3

我正在开发一个网站,让经营民宿的人可以发布他们的住宿信息。

我想要求他们在发布时包含住宿的“个人资料图片”,但我也希望他们可以选择稍后添加更多图片(这将在之后开发)。

我认为最好的办法是使用 Paperclip gem,并在我的应用程序中包含住宿和照片,后者作为关联属于第一个。

创建住宿时会创建新的照片记录。它同时具有 id 和 accommodation_id 属性。但是,图像从未上传,也没有设置回形针属性(image_file_name:nil,image_content_type:nil,image_file_size:nil),所以我得到了回形针的“丢失”照片。

对此有什么想法吗?这几天一直困扰着我。

住宿

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 %>
  <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 %>

照片

Controller 和 View 仍然与 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

最佳答案

要使用回形针创建上传,您需要在定义它的模型上使用为 has_attached_file 行提供的名称。在您的情况下,这将导致此 View 代码:

<%= form_for @accommodation, :html => { :multipart => true } do |f| %>
  <%= f.fields_for :photo do |photo_fields| %>
    <p>
      Photo<br />
      <%= photo_fields.file_field :image %>
    </p>
  <% end %>
<% end %>

在 Controller 中:

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 保护但仍在您的表单中的内容。

关于ruby-on-rails - 回形针: "missing"图片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4504705/

相关文章:

ruby-on-rails - Ruby on Rails 3 - 使用 View 和 Controller 创建插件或引擎?

ruby-on-rails - 要求 'rubygems'不起作用

ruby-on-rails - Rails 3,如何添加一个不使用与应用程序其余部分相同布局的 View ?

ruby-on-rails - 如何使用 link_to 删除回形针附件?

javascript - 涡轮链接 5 : Add external javascript file from other site in a specific page

ruby-on-rails - Ruby on rails : Calendar with events

ruby-on-rails - 使用 S3、Rails 和 Paperclip 时隐藏亚马逊网址

ruby-on-rails - 用于站点内消息传递的 Ruby Gem? (想想 LinkedIn、Facebook 等)

ruby-on-rails - 仅显示用户上传的照片(如果 Rails 中存在)

ruby-on-rails - 在多个 Rails 应用程序之间共享上传的文件