Rails 4:在编辑视图表单

时间:2015-10-02 16:49:16

标签: ruby-on-rails ruby-on-rails-4 upload paperclip attachment

已经问过similar question,但答案仅适用于Rails 3,所以我冒昧提出一个新问题。

我有一个Rails 4应用程序,其中包含以下型号:

class User < ActiveRecord::Base
  has_many :administrations
  has_many :calendars, through: :administrations
end

class Calendar < ActiveRecord::Base
  has_many :administrations
  has_many :users, through: :administrations
  has_many: :posts
end

class Administration < ActiveRecord::Base
  belongs_to :user
  belongs_to :calendar
end

class Post < ActiveRecord::Base
  belongs_to :calendar
end

Post模型具有以下属性:

references :calendar, index: true, foreign_key: true
date :date
time :time
string :subject
string :format
text :copy
attachment :image

并使用Post模型中的Paperclip设置附件如下:

has_attached_file :image, styles: { small: "64x64", med: "100x100", large: "200x200" }
validates_attachment :image, :content_type => { :content_type => "image/png" },
                                :size => { :in => 0..3000.kilobytes }

通过以下imagePost添加到form工作正常:

<%= form_for [@calendar, @calendar.posts.build] do |f| %>
  <% if @post.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@post.errors.count, "error") %> prohibited this post from being saved:</h2>

      <ul>
      <% @post.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <p>
      <%= f.label :date %><br>
      <%= f.date_select :date %>
    </p>
    <p>
      <%= f.label :time %><br>
      <%= f.time_select :time %>
    </p>
    <p>
      <%= f.label :subject %><br>
      <%= f.text_field :subject %>
    </p>
    <p>
      <%= f.label :format %><br>
      <%= f.text_field :format %>
    </p>
    <p>
      <%= f.label :copy %><br>
      <%= f.text_area :copy %>
    </p>
    <p>
      <%= f.label :image %><br>
      <%= f.file_field :image %>
    </p>
  </div>

  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

通过image视图,查看附加到Post的{​​{1}}也运行良好:

show

然而,当我转到<h2>Post from <%= @post.date.strftime("%A, %d") %></h2> <div> <p><strong>Date</strong></p> <%= @post.date.strftime("%A, %d") %> </div> <div> <p><strong>Time</strong></p> <%= @post.time.strftime("%I:%M %p") %> </div> <div> <p><strong>Subject</strong></p> <%= @post.subject %> </div> <div> <p><strong>Format</strong></p> <%= @post.format %> </div> <div> <p><strong>Copy</strong></p> <%= @post.copy %> </div> <div> <p><strong>Image</strong></p> <%= image_tag @post.image.url(:med) %> </div> 视图时,对于我之前上传过图片的帖子,我只看到允许我添加图片的字段和一条消息说&#34;没有文件选择&#34;

edit视图使用(现在)与edit视图相同的表单,如上所示。

如何实现以下目标:

  1. 让上传的图片显示在编辑页面中。
  2. 允许用户删除此图片。
  3. 允许用户将此图片替换为新图片。
  4. - - - -

    更新:我找到了解决上述第1项的方法,替换

    new

    <p>
      <%= f.label :image %><br>
      <%= f.file_field :image %>
    </p>
    

    在我的<p> <%= f.label :image %><br> <% if @post.image.exists? %> <%= image_tag @post.image.url(:med) %> <% else %> <%= f.file_field :image %> <% end %> </p> Post视图中。

    我还在研究第2项和第2项。 #3并且绝​​对可以使用这些帮助。

    - - - -

    如果有必要,我很乐意分享更多代码。

    有什么想法吗?

1 个答案:

答案 0 :(得分:2)

对于#2 - 允许用户删除图片,您可能会发现此SO Issue helpful

或者,根据Paperclip's documentation,您可以简单地创建一个虚拟复选框,并在控制器的更新方法中查看是否勾选了复选框并删除文档中提到的附件。

对于#3 - 允许用户用新图像替换此图像

简单地修改您的代码如下:

<p>
  <%= f.label :image %><br>
    <% if @post.image.exists? %>
      <%= image_tag @post.image.url(:med) %>
    <% end %>
    <%= f.file_field :image %>
</p>

这样,file_field始终存在(允许用户替换或添加他们的图像)