Madogiwa Blog

主に技術系の学習メモに使っていきます。

Ruby on Rails:インスタンス変数等をjavascriptに受け渡す方法

はじめに

Railsで取得したデータを使ってChart.jsでグラフ描画する等、Railsで扱っている変数をjsに受け渡す方法をメモφ(..)

↓イメージはこんな感じ f:id:madogiwa0124:20170918142442p:plain

手順

概要

  1. 取得データをJSONに変換し、HTML要素のdata属性に設定(viewに埋め込む)
  2. jsで設定した要素のdata属性の値を取得

RailsでViewに埋め込んだJSONjavascript側でパースして受け取って、使用するイメージです(/・ω・)/

ソースコード

hoge.html.erb

<div id="tag_info" data-json="<%= current_user.favorite_tags_info.to_json %>" ></div>

hoge.js

tags = JSON.parse(document.getElementById('tag_info').dataset.json);

おまけ

gonというGemを使っても出来るらしいφ(..)

github.com

qiita.com

参考

qiita.com

Ruby on Rails:文字列の一部だけエスケープさせずにHTMLとして認識させる方法

はじめに

掲示板のアプリケーション等、特定の文字部分(>>3等)を<a></a>として認識させる方法をメモφ(..)

↓イメージはこういう感じ f:id:madogiwa0124:20170916104509p:plain

やりかた

今回は>>数字を返信用の文字列として扱い、<a></a>でページ内リンクを貼るケースを想定してますφ(..)

  1. 文字列全体をhメソッドを使ってエスケープ
  2. エスケープされた文字列の返信用文字列&gt;&gt;>>に置換
  3. >>数値部を抽出し、リンク用のHTMLを生成し本文に埋め込む
  4. 出力側のViewでhtml_safeで出力

実際のソースコード

hoge_helper.rb

  def format_comment(content)
    # 返信用の文字列を定義
    reply = { char: '>>', escaped: '&gt;&gt;' }
    # コメント本文のHTMLをエスケープ後、返信用の文字列のみをHTMLとして再定義
    content = h(content).gsub(reply[:escaped], reply[:char])
    # 返信先リンク部の取得
    content_arry = content.split(" ")
    target = content_arry.select{ |c| c.include?(reply[:char]) }
    target.each do |t|
      # 返信先リンクHTMLの生成
      to = t.match(/#{reply[:char]}\d+/).to_s
      link_html = link_to to, "#comment_#{to.gsub(reply[:char], '')}"
      # 本文の返信部を返信先リンクHTMLで置換
      content = content.gsub(to, link_html)
    end
    content
  end

index.html.erb

<p><%= format_comment(comment.content).html_safe %></p>

以上

参考

www.rubylife.jp

qiita.com

Ruby:複数の区切り文字で文字列を分割する方法(String.split)

はじめに

英語の文章を".“、”!“、”?“等の複数の区切り文字で分割する方法を調べたのでメモφ(..)

複数の区切り文字で分割する方法

区切り文字を統一後、分割する

String.splitを呼び出す前に、区切り文字を置換し統一してあげればOK!(/・ω・)/
今回のケースでは、?!.に置換後にString.splitを呼び出しています。

str = "I have a pen. I have an apple. I have a pen? I have an apple!"
key = "pen"
str = str.gsub("!",".").gsub("?",".")
p str.split(".")
# result : ["I have a pen", " I have an apple", " I have a pen", " I have an apple"]

正規表現を引数に渡す

String.split正規表現を引数として渡してあげればOK!(/・ω・)/
今回のケースでは/\.|\?|!/という正規表現を与えて、.?!で分割されるようにしました。
.?は、正規表現予約語のため、エスケープしています。

str = "I have a pen. I have an apple. I have a pen? I have an apple!"
key = "pen"
p str.split(/\.|\?|!/)
# result : ["I have a pen", " I have an apple", " I have a pen", " I have an apple"]

おまけ

区切り文字で文章を分割後、再度区切り文字を付与する書き方を載せてみましたφ(..)

str = "I have a pen. I have an apple. I have a pen? I have an apple!"
key = "pen"
spliter = /\.|\?|!/
# 区切り文字を出現順に保存
split_chars = str.split("").select{ |s| s.match(spliter) }
# 区切り文字で文章を分割後、区切り文字を再度付与
str_array = str.split(spliter).zip(split_chars).map{|s| s.join }
# 結果出力
p str_array
# result : ["I have a pen.", " I have an apple.", " I have a pen?", " I have an apple!"]

以上

参考

qiita.com

qiita.com

RubyonRails:herokuのDBを開発環境(ローカル)へリストア(復元)する。

はじめに

herokuで運営しているサービス(https://moook.herokuapp.com/)の本番環境のデータを開発環境に反映させたときの手順をメモφ(..)

前提

環境

今回の手順を行った環境は下記の通りです。

title memo
Production環境 heroku
Rails ver 5.1.2
DB postgresql

手順

herokuでDBのバックアップを実行

herokuにログインした状態で下記コマンドを実行します。

rem バックアップ取得コマンド
$ heroku pg:backups:capture

Starting backup of postgresql-asymmetrical-20043... done

Use Ctrl-C at any time to stop monitoring progress; the backup will continue running.
Use heroku pg:backups:info to check progress.
Stop a running backup with heroku pg:backups:cancel.

Backing up DATABASE to b002... done

最後の行にある'b002'という文言が、バックアップの目印になります。

バックアップファイルをダウンロードする。

rem 先程取得したバックアップのURLを取得
$ heroku pg:backups:url b002

https://xfrtu.s3.amazonaws.com/6026beb4-c189-4732-b78b...

取得したURLにブラウザからアクセスするとバックアップファイルをダウンロード出来ます。

バックアップを開発環境のDBにリストア

下記コマンドを使って開発環境に本番環境DBのバックアップをリストアします。
下記のような実行結果になればOK。

$ pg_restore --verbose --clean --no-acl --no-owner -h localhost -U user_name -d db_name backup_file_path
省略
pg_restore: setting owner and privileges for INDEX "public.taggings_idx"
pg_restore: setting owner and privileges for INDEX "public.taggings_idy"
pg_restore: setting owner and privileges for FK CONSTRAINT "public.favorites fk_rails_72d9d9e5bf"
pg_restore: setting owner and privileges for FK CONSTRAINT "public.favorites fk_rails_d15744e438"
title memo
user_name DBのユーザー名※1
db_name 対象のDB名※2
backup_file_path バックアップファイルのパス

※1:DBのユーザー名の確認方法 rails dbコマンドを実行し、posgresqlから下記コマンドを実行して確認

$ rails db
$ db_name=# SELECT usename FROM pg_user;
 usename
---------
 UserName
(1 row)

※2:DB名の確認方法 database.ymldatabaseの項目を確認

database.yml

development:
  <<: *default
  database: appname_development

参考

www.workabroad.jp

以上

Ruby on Rails:ファビコン(タイトルアイコン)の設定方法

はじめに

Ruby on Railsで作成したWebアプリケーションにファビコンを設定する方法をメモφ(..)

設定方法

app/assets/imagesフォルダにファビコン用の画像を配置し、application.html.erb内に下記を記述します。

application.html.erb

# favicon.pngは任意のファイル名に変更
<%= favicon_link_tag 'favicon.png'%>

ブラウザのタグにファビコンが設定されます。

f:id:madogiwa0124:20170903113906p:plain

以上

Googleの検索結果にページが表示されない場合の対処法

はじめに

最近作ったWebサービスが、全然googleの検索結果に乗らなくて悲しかったので、対処法をメモφ(..)

Google検索の仕組み

Google では、「ウェブ クローラ」と呼ばれるソフトウェアを使用して、公開されているウェブページをクロール(情報を取得)します。最もよく知られているクローラは「Googlebot」です。クローラは、ユーザーがウェブ上でコンテンツを閲覧する場合と同じように、ウェブページを見て、ページ上のリンクをたどります。リンクからリンクに移動し、これらのウェブページに関するデータを Google のサーバーに蓄積していきます。

クロールとインデックス – 検索サービス – Google

通常では、GoogleのWebクローラーがWebページを自動的に検知し、サーバー上に蓄積していくが、リンク等が貼られていない段階では中々見つけて貰えないようです。。。

Googleへ登録リクエストを送信

下記のページからgoogleへWebページの登録リクエストを送ることが出来ます。
私の場合は、登録リクエストの送信後、5分かからずに検索結果に反映されました…!゚゚( ゚д゚ )クワッ!!

www.google.com

Googleへの登録有無の確認

対象のWebページがGoogleに登録されているかどうかは、site:Wenbページのurlで検索すれば確認できます。

f:id:madogiwa0124:20170903104754p:plain

検索結果にWebページが表示されてればOKです。

参考

officehit.biz

Ruby on Rails:メール送信処理の準備・実装内容について(開発・本番環境)

はじめに

Ruby on Railsでメール送信を行う際に必要となったツール及び実装を整理しましたφ(..)

目次

ActionMailerとは

Railsには、メールを送信するために、ActionMailerという仕組みがあります。 ActionMailerは、コントローラやーViewと同じような使い方でメールを送信させることができます。

railsguides.jp

用意するツール

SendGrid

SendGridを使うことで、自前でSMTPサーバ(メール送信用の端末)を 用意しなくてもRailsからメールを送付することが出来る。

SendGridはクラウドベースのメール配信サービスです。 アカウントを取得するだけですぐに利用を開始でき、簡単・確実にメールをお届けします。 面倒なメンテナンス作業や無駄なコストを削減し、ビジネスを加速させましょう!

sendgrid.kke.co.jp

使い方

herokuへプラグインを導入

rem SendGridのプラグインを導入
rem Herokuアカウントにクレジットカード情報を登録しないとエラーとなるため注意
heroku addons:create sendgrid:starter

設定用にSendgridの情報を取得

rem USER_NAMEの確認  
heroku config:get SENDGRID_USERNAME

rem PASSWORDの確認  
heroku config:get SENDGRID_PASSWORD

SendGridの情報を環境変数へ設定

rem USER_NAMEの環境変数設定  
heroku config:set SENDGRID_USERNAME=(調べたSENDGRID_USERNAME)

rem PASSWORDの環境変数設定  
heroku config:set SENDGRID_PASSWORD=(調べたSENDGRID_PASSWORD)

設定ファイルの編集

config/environments/production.rbに下記を追記

config.action_mailer.default_url_options = { host: '自分のHerokuアプリのドメイン' } #hoge.herokuapp.com
ActionMailer::Base.delivery_method = :smtp
ActionMailer::Base.smtp_settings =
{
 user_name: ENV['SENDGRID_USERNAME'],
 password: ENV['SENDGRID_PASSWORD'],
 domain: "heroku.com",
 address: "smtp.sendgrid.net",
 port: 587,
 authentication: :plain,
 enable_starttls_auto: true
}

環境変数からユーザー名やパスワードを取得することによって、公開を防ぐ事ができる。

rem herokuのドメイン名確認
heroku domains

letter_opener_web

letter_opener_webはメールの送信結果をブラウザ上で確認出来るgem

github.com

使い方

gemのインストール

Gemfileへ下記を追記し、bundle install実施する。

省略
# 開発環境のみで使用
group :development do
  gem 'letter_opener_web'
end

lettor_opener_webのroutingを設定

config/routesに下記を追記する。

# 開発環境かどうかを判断
if Rails.env.development?
  mount LetterOpenerWeb::Engine, at: "/letter_opener"
end

開発環境の環境設定

config/environments/development.rbに下記を追記

# 省略
config.action_mailer.default_url_options = { host: 'localhost:3000' }
config.action_mailer.delivery_method = :letter_opener_web

メール送信処理を実装する

手順概要

  1. Mailerの生成
  2. Mailerの実装
  3. Mail Viewの実装
  4. 送信アクションの実装

メール送信処理概要

  • 送信アクションの実行(Mailerの呼び出し)
  • MailerがMail Viewを元に本文を生成し、送信

具体的な実装内容

Mailerの生成

rails g mailer "Mailer名"
rem rails g mailer "Mailer名" "メソッド名"で、メソッドをあわせて作成することも可能

Mailerの実装

Mailerでは宛先とメールのタイトル等を指定可能、引数も取ることが出来る。 app/mailers/notice_mailer.rb

class NoticeMailer < ApplicationMailer
省略
  def sendmail_blog(blog)
   @blog = blog
   mail to: "メールアドレス",  # 宛先
         subject: "メールタイトル" # メールのタイトル
  end
end

Mail Viewの実装

Mail Viewでは実装に送信するメールの文面を通常のViewのように記載可能
※MailerもControllerと同様にメソッド名と紐付いたViewを取得するため注意

app/views/notice_mailer/sendmail_blog.html.erb

<h1>新しくブログが投稿されました!</h1>

<h4>title: <%= @blog.title %></h4>
<p>content: <%= @blog.content %></p>

<p>
  <%= link_to '投稿されたブログはこちら', blogs_url %>
</p>

※テキスト形式のメール文面も作成する場合はapp/views/notice_mailer/sendmail_blog.text.erbも合わせて編集する。

送信アクションの実装

メールの送信にはdeliverメソッドを使用する。

app/controllers/blogs_controller.rb

 def create
    @blog = Blog.new(blogs_params)
    if @blog.save
      redirect_to blogs_path, notice: "ブログを作成しました!"
      NoticeMailer.sendmail_blog(@blog).deliver
    else
      render 'new'
    end
  end

以上