LoginSignup
8
9

More than 3 years have passed since last update.

めんどくさい飲み会案内状はRailsで作ろう ※休止中

Last updated at Posted at 2018-09-02

とあるローテク企業・・・
A課長yaranaio_01.png
「最近は暑い日が続くし、ぱぁっと課のみんなで暑気払いの会でもしたいね。やる夫君、セッティングを頼むよ。」
やる夫yaruo_35.png
「はい、喜んで!」
・・・
やる夫yaruo_35.png
「参加者もとりまとめて、お店も予約したお」
「あとは皆に案内をしないといけないお。一応、課の行事だしワードで案内状を作るお!」
「ポチポチ(会社PCで食べログにアクセス)」

---(アクセス禁止:グルメサイト)管理者にレポートを送信しました。---

やる夫yaruo_02.png
「(ク○仕様だお)」
「しょうがないから、自前のスマホで食べログ゙掲載情報をワードにコピペして案内状を作るお。ワードに、お店の名前をコピペ、お店の住所をコピペ、電話番号をコピペ……と。後は地図も添付しないといけないお。グーグルマップからスクリーンショットして、ペイントに貼り付け保存して、おっと地図pngのサイズが700KBだお。200MBしか個人メールボックス容量が与えられていないク○仕様だから、このまま送信すると皆に迷惑がかかるお。画像はPDFに変換してサイズを落としてと……。」
・・・
「(ワード案内状完成)ポチッ、送信」
・・・
参加者minna_08.png
「やる夫から届いた案内状を印刷したけど、地図の縮尺が大きいし白黒印刷だから参考にならないな(ポイッ)。しょうがないから自分のスマホで食べログ検索して地図を見るか。(ポチポチ)」

作ったもの

後付け理由ですが、そんな飲み会情報の案内・共有の苦労を少しでも解消したくて、飲み会案内状の作成・共有ページを作成しました。

→飲み会案内状等作成・共有ページ

仕組みは、

STEP1:開催する店名を検索 → (店名、住所、電話番号、ホームページ、地図を抽出入力。)
STEP2:会の名称、開催日時等の情報を入力送信 → (案内状を作成。)
STEP3:作成した案内ページのURLを参加者と共有すれば、誰でも必要な情報を確認できる。

というものです。コードはとりあえずは動くものですが、冗長・不正確な部分があるかもしれません、ご容赦ください。

STEP1:開催する店名を検索

1検索画面.png

◎検索ワードのフォーム送信
step1.html.erb
<%= form_tag("/annaisearch") do %>
  <div class="form">
    <%= label :name, "(例1岐阜市 居酒屋 花串庵  例2下呂市 水明館" %><br />
    <%= text_field_tag :name %>
  </div>
  <div class="form">
    <%= submit_tag '検索' %>
<% end %>

・form_tagで、検索ワードをcontrollerに定義した(/annaisearch)に飛ばしています。

◎controller側で情報取得・DB保存
controller.rb
def annaisearch
 word = params[:name]
 googlemapsapi = "https://maps.googleapis.com/maps/api/place/textsearch/json?query=#{word}&key=#{ENV["CONSUMER_KEY"]}&language=ja"
 #<中略>しています。
end

・controller側では検索ワードをparamsで取得し変数wordに代入します。そして変数wordをGoogleMapsAPIに埋め込みます。(その後は中略していますが、GoogleMapsAPIから返される店名等の情報を取得し、データベースに保存しています。)
※#{ENV["CONSUMER_KEY"]}は、'dotenv-rails'のgemの導入によるものです。
 →API key等をgithubで公開しない方法(rails,heroku)

STEP2:会の名称、開催日時等の情報を入力送信

2入力画面.png

◎様々なフォーム送信(1行テキスト、複数行テキスト、日時、数値、ラジオボタン)※抜粋記載
step2.html.erb
<%= form_tag("/annaiww/#{@model.id}/#{@model.placeid}") do %>
#1行テキスト
  <%= text_field_tag :name  %>
#複数行テキスト
  <%= text_area_tag :name2 %>
#日時
  <input type="datetime-local" name="name3"></input>
#数値
  <%= number_field_tag :name4 %>
#ラジオボタン
  4月<%= radio_button :name5, 'radio',  {:checked => @radio} %>
<% end %>

・入力内容の送信はSTEP1と同じく、form_tagを使っています。(form_forの方が簡潔に記載できるかもしれません。)
・「:name」は送信するときの属性で、フォーム送信された値をparams[:name]で取得します。
・日時については、form_tagヘルパーではなく、HTMLのinputタグを使用しています。
・ラジオボタンに初期値を設定する方法は次の記事が参考になりました。({:checked => @radio}部分)
 →railsでラジオボタンの初期値を変数で指定する方法

◎案内ページのURLを複雑なものにしています。
route.rb
 get  "/annaiw/:id/:placeid" => "home#annaiw"

・電話番号等の情報を表示することを想定しているのため、案内ページを無関係な人がアドレス直打ちで見られる状況は好ましくありません。最初は案内ページのルートを(/annaiw/:id)と設定していたのですが、これだと誰でもURLの連番数字を打ち換えれば案内状のページにアクセスできてしまいました。
・ログイン機能を実装せずに参加者のみが閲覧できる状態にするため、URLを複雑化することを考え、ルート・フォーム送信を(/annaiw/:id/:placeid)としています。(※placeidはgoogleにより施設毎に設定されている複雑な英数字で構成されるIDです。)

controller.rb
  def annaiw
    @model = Model.find_by(id: params[:id])
    @radio = true
    if params[:placeid] != @model.placeid
     redirect_to("/annai")
    end
  end

・controller側では、URL送信されたplaceidと、データベースに保存されたplaceidが一致しない場合は、検索ページへリダイレクトするように設定しています。

◎加えて案内ページは検索避けの設定をしています。
step2-2.html.erb
<meta name="robots" content="noindex,nofollow,noarchive" />

・朝日新聞の電子版が不都合な記事に設定していたことで話題(問題)になり、こういう手法があるんだ!と知りました。コードをヘッダーに埋め込めば、Googleではインデックス(検索)されなくなります。

STEP3:作成した案内ページのURLを参加者と共有すれば、誰でも必要な情報を確認できる。

3案内状完成.png

◎案内の情報をrtf形式でダウンロードする機能を付けました。
◆view側
step3.html.erb
<%= link_to(
     'この会の情報をrtfファイルでDL',msword_path(
     id:params[:id],comment:[params:@model.comment]
     ),
     method: :post
    ) %>

・リンクをクリックした際に、idをコントローラー側に定義したmswordメソッド(rtfダウンロードを定義したメソッド)に渡します。
・commentはデータベースに登録されていない情報を、リンクをクリックした際に一緒に飛ばすため記述しています(mswordメソッドはidからデータベースの登録情報を読み出しますが、commentはデータベースに登録されていない情報のためリンクをクリックした際に一緒にmswordメソッドに飛ばす必要がありました。)
 (参考)link_toでPOSTする際にパラメータを渡す方法

◆controller側
controller.rb
  def msword
   @model = Model.find_by(id: params[:id])
   @comment = params[:comment][0]["params"]
   f = File.open("./public/template/template.rtf","r")
   fr = f.read
   frr = fr.sub("@model.kainame",@model.kainame) #<後略>
   f.close
   f = File.open("./public/template/#{@with.id}.rtf", "w")
   f.write(frr)
   f.close

   filepath = Rails.root.join('public', 'template', "#{@model.id}.rtf")
   stat = File::stat(filepath)
   send_file(filepath, :filename => "#{@model.id}.rtf", :length => stat.size)
  end 

・まず、public/templateフォルダ内に事前に用意したtemplate.rtfを読み込みます。次にtemplate.rtfの内容をデータベースに登録された情報へとsubメソッドで書き換え、内容を変数frrに代入します。そしてpublic/templateフォルダ内に新たにid.rtfファイルを作成し、frrの内容を書き込み保存します。
・最後にsend_fileメソッドが指定されたパスに存在するファイルを読み込み、その内容をクライアントに送信します。
(encodingがutf-8のため、閲覧ソフトによっては文字化けすることがあります。エンコーディング難しい…。)

◎URLで共有することを前提としているため、以下を参考にURLコピーポタンを設置しました。

クリック一つでクリップボードにコピーする機能(HTMLとJavaScriptのみで実現)

◎SNSボタンも以下を参考に簡単設置しました。

SNS(Twitter/Facebook/LINE)シェアボタンを超簡単に設置する方法

最後に

以上、素人が拙いコードで失礼しました。最初は観光地紹介サイトを作っていたのですが、Railsを触っているうち、こんなこともできるんじゃない?と思って作りました。独学で学習していると、こんなコードで大丈夫だろうか?とか、こんな方法でエンジニアの現場で通用するだろうか?など、不安は尽きないですがRailsを触っているのは楽しいのでアウトプットを続けていきたいです。使ってもらえるとモチベーションになりますし、少しでも参考になれば嬉しいです!

8
9
1

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
8
9