💡

[Rails]フラッシュメッセージでURLを表示させる方法

2023/03/13に公開2

フラッシュメッセージで表示させたいURLを取得する方法

フラッシュメッセージで表示させたいURLを取得する方法は複数ある。

  • "コントローラーで作成した変数からURLを取得する場合"
  • "直接URLの文字列をflash.now[:notice]に設定する場合"]
    この二つのコントローラーへの書き方の違いでも、
    viewへの書き方が違ってくる。
    コントローラーでの定義の仕方も複数存在する。

controllerからみよう。

controller

  1. データベースに保存されたURLを取得する場合
    は、以下のように記述。
# controller
@event = Event.find(params[:id])
flash.now[:notice] = "URL: #{@event.url}"
  1. フォームから送信されたURLを取得する場合
# controller
flash.now[:notice] = "URL: #{params[:url]}"

view

  • コントローラーで作成した@event変数からURLを取得する場合
def update
  @event = Event.find(params[:id])
  @event.update(event_params)
  flash.now[:notice] = @event.url
  render :show
end

# ビュー
<% if flash.now[:notice] =~ /https?:\/\/[\S]+/ %>
  <% flash.now[:notice].scan(/https?:\/\/[\S]+/) do |url| %>
    <p>参加用URL : <br />
      <%= link_to url, url %></p>
  <% end %>
<% else %>
  <p class="mb-3"><%= flash.now[:notice] %></p>
<% end %>
  • 直接URLの文字列をflash.now[:notice]に設定する場合
# コントローラー
def update
  flash.now[:notice] = "https://example.com/event/1234"
  render :show
end

# ビュー
<% if flash.now[:notice] =~ /https?:\/\/[\S]+/ %>
  <% flash.now[:notice].scan(/https?:\/\/[\S]+/) do |url| %>
    <p>参加用URL : <br />
      <%= link_to url, url %></p>
  <% end %>
<% else %>
  <p class="mb-3"><%= flash.now[:notice] %></p>
<% end %>

共通点

両方とも正規表現を使っているが、
正規表現を使ってURLかどうかを判別し、URLの場合はリンク付きのメッセージを表示するようにしている。

正規表現は、文字列がhttps://またはhttp://で始まり、
その後に何らかの非空白文字が続くURLをマッチングします。


Discussion