開発しているサービスで確認画面にてアップロードするファイル名を表示するのに少しハマったので共有します。
こちらのブログを参考にフォームを作成します。
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"
ファイルの名前や拡張子も簡単に取得できますね!