如何将多个图像保存到rails

时间:2016-08-10 18:25:27

标签: ruby-on-rails ruby

我是rails的新手,并创建了一个存储公寓信息的房地产应用程序。

我有一个公寓模型,视图和控制器,所以我可以CRUD公寓。

现在,我想添加将多张图片添加到公寓的功能。

我已经安装了gem carrierwave,mini_magick和fog gems。

我创建了一个Image模型,其中包含picture(string)列和apartment_id(整数)列。然后我在Image和Apartment之间创建了belongs_to / has_many关系。

我的问题是:如何在“创建公寓”视图中创建图像模型的实例?

我假设我在公寓控制器中做了类似的事情,但我不确定:

  def new
    @apartment = Apartment.new
  end

  def create
    @apartment = current_user.apartments.new(apartment_params)
    **@image = @apartment.images.new(?)**

    if @apartment.save **&& @image.save**
       flash[:notice] = "Congratulations! Your apartment has been added."
       redirect_to apartments_path
    else
       flash[:error] = "There was an error saving your listing. Please try again."
       render :new
    end
  end

private

def apartment_params
  params.require(:apartment).permit(:street, :from_date, :to_date, :to_date_open, :flex_dates, :price, :price_neg, :agent_fee, :furnished, :package, :flights, :beds, :baths, :description)
end

另外,我不确定如何更改视图中的代码:

<%= form_for(@apartment) do |f| %>
  <% if @apartment.errors.any? %>
    <div id="error_explanation">
      <ul>
      <% @apartment.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= f.label :street %><br>
    <%= f.text_field :street %>
  </div>

  **<div class="field">
    <%= f.label :picture %>
    <%= f.file_field :picture %>
    <%#= f.hidden_field :picture_cache %>
  </div>**

有关如何在创建新公寓时添加图像的任何指导都会很棒。

提前致谢!!

1 个答案:

答案 0 :(得分:0)

我过去如何处理这个问题是两个还有另外两个模型。我会创建一个画廊,一个是照片。

照片上可以提供有关您关注名称或描述的更多信息。照片链接到图库,因此它知道它属于哪个图库。

画廊然后只有一个名字和公寓的链接。我喜欢把它分开来,以防你想要做任何特别的事情,比如挑选哪张照片是画廊中的第一张什么的。

如果你不在乎那么你可以很容易地用照片做另一个crud模型并将它给它为apartment_id。

我会稍后处理照片上传,而不是在公寓上市时,它会帮助人们在上市公寓的障碍较低时获得更多投资。

因此,如果您使用图库进行操作,我将运行的命令是

rails g scaffold gallery name:string apartment:belongs_to

rails g scaffold photo name:string information:text photo_url:string gallery:belongs_to

或没有图库

rails g scaffold photo name:string information:text photo_url:string apartment:belongs_to

尽管如此,您必须更新照片模型和控制器才能使用carrierwave。