LoginSignup
2
5

More than 3 years have passed since last update.

Railsのフォームの確認画面でアップロードする画像のファイル名を表示する

Posted at

開発しているサービスで確認画面にてアップロードするファイル名を表示するのに少しハマったので共有します。

こちらのブログを参考にフォームを作成します。
http://rakio1234.hatenablog.com/entry/2017/01/09/234744

まずはフォームを作成

確認画面であるurlオプションでconfirm.html.erbに飛ばします。

new.html.erb
<div class="form">
  <%= form_with model: @hoge, url: {action: 'confirm'} do |f| %>
      <div>
        <%= f.label :image, "画像ファイル" %>
        <%= f.file_field :image %>
        <%= f.hidden_field :image_cache %>
      </div>
      <div>
        <%= f.submit "確認画面へ進む" %>
      </div>
  <% end %>
</div>

コントローラーはこちら

hoge_controller.rb
  def confirm
    @hoge =  Hoge.new(hoge_params)

    return if @hoge.valid?(:hoge_validation) #validateチェック
    flash.now[:alert] = "入力内容にエラーがあります。"
    render :new 
  end

  private

    def hoge_params
      params.require(:hoge).permit(:image, :image_cache)
    end

フォームの確認画面

confirm.html.erb
<div class="container">

  <div>
    <!-- 三項演算子 -->
    <p><%= @hoge.image.present? ? @hoge.image.filename : "添付ファイルなし" %></p>
  </div>

  <div>
    <%= form_with model: @hoge, url: hoges_path do |f| %>
      <%= f.hidden_field :image, value: @hoge.image %>
      <%= f.hidden_field :image_cache, value: @hoge.image_cache %>
      <%= f.submit '投稿する' %>
    <% end %>

    <%= form_with model: @hoge, url: new_hoge_path do |f| %>
      <%= f.hidden_field :image, value: @hoge.image %>
      <%= f.hidden_field :image_cache, value: @hoge.image_cache %>
      <%= f.submit '入力画面へ戻る' %>
    <% end %>
  </div>
</div>

@hoge.imageにfilenameをつけることによってファイル名を取得できる!
これだけのことにだいぶハマりました。
入力画面へ戻るときはbackアクションへ、そのまま投稿する場合はcreateアクションへ

hoge_controller.rb
  def back
    @hoge = Hoge.new(hoge_params)
    render :new
  end

  def create
    Hoge.create!(hoge_params)
    flash[:success] = "保存に成功しました!"
    redirect_to  complete_hoge_path
  end

「入力画面へ戻る」ボタンを押したら、backアクションが呼ばれるようroutingを設定

routes.rb
   resources :hoge do
     collection do
        post :new, path: :new, as: :new, action: :back
     end
   end

これでbackアクションが呼ばれた際、routingで戻った先のURLはhoge/newになる。

ちなみに

ファイル名だけ、拡張子だけをそれぞれ取得する場合は下記の通り。
拡張子を含むファイル名がsample.rbだとすると

File.basename("sample.rb", ".*")
#=> "sample"

File.extname("sample.rb")
#=> ".rb"

ファイルの名前や拡張子も簡単に取得できますね!

2
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
5