2014-07-05 50 views
1

我可以上傳文件並將文件名保存在數據庫中。 但我編輯時沒有出現文件名。Rails4:如何使用carrierwave顯示和編輯上傳的文件?

我想:

  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 

photo.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

當我編輯, 「:內容」 被顯示。但「:形象」是「沒有選擇的文件」 ...

<%= 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) 
+0

當你提交表單時,你可以發佈'log'中生成的'params'嗎? – Pavan

+0

Pavan,謝謝你的及時回覆。 Althogh在我提交新文章時更新了以上的development.log,我不知道接下來要做什麼。 – SamuraiBlue

回答

4

我已經想出了同樣的問題,但早沒沒有找到任何解決方案。我在這裏所做的

<%= 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」 :此輸入 元素接受一個文件名,該文件名可能只能通過編程方式設置爲空字符串 。

+0

謝謝,拉胡爾辛格。顯示文件名稱和圖像!但我也想知道如何顯示文件名,而不是「沒有選擇文件」的消息。 – SamuraiBlue

+0

要做的一種方法是,隱藏文件字段並添加一個按鈕,然後單擊按鈕,通過js單擊file_field。並用js替換新選擇的文件的文件名。 –

+0

我還沒有嘗試過你的最新評論,但我發現** NoMethodError在文章#new **「未定義的方法'文件名'爲nil:NilClass」在<%= p.object.image.file.filename% >'當我調用new.html.erb,其中有<%= render'shared \ article_form'%>'與articles \ edit.html.erb相同。 – SamuraiBlue

相關問題