【问题标题】:Rails4 : How do I display and edit uploaded file using carrierwave?Rails4:如何使用carrierwave显示和编辑上传的文件?
【发布时间】:2023-03-14 21:55:01
【问题描述】:

我可以上传文件并将文件名保存在数据库中。 但是我编辑时文件名没有出现。

我想:

  1. 点击_article.html.erb中的“编辑”链接时显示文件名和上传的图片。
  2. 在_article.html.erb中显示上传的图片。

article.rb

class Article < ActiveRecord::Base
    .
    .
    has_many :photos, dependent: :destroy
    accepts_nested_attributes_for :photos
    .
    .
end

照片.rb

class Photo < ActiveRecord::Base
    belongs_to :article
    mount_uploader :image, ImageUploader
    validates :image, presence: true
    #validates :article_id, presence: true
end

.schema 文章

CREATE TABLE "articles" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, 
"content" varchar(255), 
"user_id" integer, 
"created_at" datetime, 
"updated_at" datetime,);

.schema 照片

CREATE TABLE "photos" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, 
"article_id" integer, 
"image" varchar(255), 
"created_at" datetime, 
"updated_at" datetime);

articles_controller.rb

class ArticlesController < ApplicationController
    .
    .
  def new
    @article = Article.new
    @article.photos.build
    .
    .
  end

  def create
    @article = current_user.articles.build(article_params)
    .
    .
  end

  def edit
    @article = Article.find(params[:id])
  end

  def update
    @article = Article.find(params[:id])
    if @article.update(article_params)
      redirect_to current_user
    else
      render 'edit'
    end
  end
    .
    .
  private

    def article_params
      params.require(:article).permit(:content, photos_attributes: [:id, :article_id, :image])
    end
    .
    .
end

文章\_article.html.erb

我想在此处以及点击“编辑”链接 (_article_form.html.erb) 后显示上传的图片和文件名

<li>
    .
    .
  <span class="content"><%= article.content %></span>
  <% if current_user?(article.user) %>
    <%= link_to "Edit", edit_article_path(article.id), class: "btn btn-default" %>
  <% end %>
</li>

文章\edit.html.erb

<h1>Update article</h1>
<div class="row">
        <%= render 'shared/article_form' %>
</div>

共享\_article_form.html.erb

当我编辑时,会显示“:content”。但是 ":image" 是 "没有选择文件" ...

<%= form_for(@article) do |f| %>
  <div class="field">
    <%= f.text_area :content, placeholder: "Compose new article..." %>
    <%= f.fields_for :photos do |p| %>
      <%= p.hidden_field :article_id %>
      <%= p.label :image %>
      <%= p.file_field :image %>
    <% end %>
  </div>
  <%= f.submit "Post", class: "btn btn-large btn-primary" %>
<% end %>

development.log(当我提交新文章时)

Started POST "/articles" for 127.0.0.1 at 2014-07-05 16:31:11 +0900
Processing by ArticlesController#create as HTML
  Parameters: {"utf8"=>"?","authenticity_token"=>"uaWcqBZ6rhS/NIal/...=", "article"=>{"category_id"=>"6", "content"=>"last", "photos_attributes"=>{"0"=>{"article_id"=>"", "image"=>#<ActionDispatch::Http::UploadedFile:0x3cb0910 @tempfile=#<File:C:/.../AppData/Local/Temp/RackMultipart20140705-6112-1q9t7r6>, @original_filename="DSCN0721_080.JPG", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"article[photos_attributes][0][image]\"; filename=\"DSCN0721_080.JPG\"\r\nContent-Type: image/jpeg\r\n">}}}, "commit"=>"Post"}
  [1m[35mUser Load (1.0ms)[0m  SELECT "users".* FROM "users" WHERE "users"."remember_token" = '...' LIMIT 1
  [1m[36m (0.0ms)[0m  [1mbegin transaction[0m
  [1m[35mSQL (3.0ms)[0m  INSERT INTO "articles" ("content", "created_at", "category_id", "updated_at", "user_id") VALUES (?, ?, ?, ?, ?)  [["content", "last"], ["created_at", Sat, 05 Jul 2014 07:31:11 UTC +00:00], ["category_id", 6], ["updated_at", Sat, 05 Jul 2014 07:31:11 UTC +00:00], ["user_id", 1]]
  [1m[36mSQL (27.0ms)[0m  [1mINSERT INTO "photos" ("article_id", "created_at", "image", "updated_at") VALUES (?, ?, ?, ?)[0m  [["article_id", 306], ["created_at", Sat, 05 Jul 2014 07:31:11 UTC +00:00], ["image", "DSCN0721_080.JPG"], ["updated_at", Sat, 05 Jul 2014 07:31:11 UTC +00:00]]
  [1m[35m (5.0ms)[0m  commit transaction
Redirected to http://localhost:3000/users/1
Completed 302 Found in 128ms (ActiveRecord: 36.0ms)

【问题讨论】:

  • 可以把logsubmit表单中生成的params贴出来吗?
  • 帕万,感谢您的及时回复。虽然我在提交新文章时更新了上面的 development.log,但我不知道下一步该怎么做。

标签: ruby-on-rails ruby-on-rails-4 carrierwave


【解决方案1】:

我之前也遇到过同样的问题,但没有找到任何解决方案。我做的是这里

<%= form_for(@article) do |f| %>
  <div class="field">
    <%= f.text_area :content, placeholder: "Compose new article..." %>
    <%= f.fields_for :photos, @article.photos do |p| %>
      <%= p.hidden_field :article_id %>
      <%= p.label :image %>
      <% if p.object.image %>
        <%= image_tag p.object.image.url %>
        <p><%= p.object.image.file.filename %></p>
      <% end %>
      <%= p.file_field :image %>
    <% end %>
  </div>
  <%= f.submit "Post", class: "btn btn-large btn-primary" %>
<% end %>

即使你尝试通过 js 将图片文件名设置为 file_field 也会出现如下错误

未能在“HTMLInputElement”上设置“value”属性:此输入 element 接受一个文件名,该文件名只能以编程方式设置为 空字符串。

【讨论】:

  • 谢谢,拉胡尔辛格。显示文件名和图像!!但我也想知道如何显示文件名而不是“未选择文件”消息。
  • 一种方法是隐藏文件字段并添加一个按钮,然后单击按钮通过js单击file_field。并通过js用新选择的文件替换文件名。
  • 我没有尝试过你的最新评论,但我发现&lt;%= p.object.image.file.filename %&gt; 中的 NoMethodError in Articles#new "undefined method 'filename' for nil:NilClass" when我调用 new.html.erb ,它的 &lt;%= render 'shared/article_form' %&gt; 与articles\edit.html.erb 相同。
  • 改变条件
  • Rahul Singh,非常感谢您的有用回答。它有效!
猜你喜欢
  • 1970-01-01
  • 2015-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-05
  • 2016-08-18
相关资源
最近更新 更多