#author("2021-05-06T02:59:13+00:00","default:src128","src128")
#author("2021-06-17T05:02:04+00:00","default:src128","src128")
&tag(Rails/Tips);
*目次 [#mcf1ff40]
#contents
*関連ページ [#xe9cf991]
-[[Rails]]

*参考情報 [#fd128caa]

*一般 [#s8c8eeb0]

**Railsのlibファイルの自動読み込みの設定 [#o31dbfaf]
-lib以下のファイルはapplication.rbで以下のように追加し、lib以下に規約に従ったrbファイルをつくる必要がある。
#pre{{
config.autoload_paths += %W(#{config.root}/lib)
config.autoload_paths += Dir["#{config.root}/lib/**/"]
}}
-規約に関しては以下のリンクが参考になる。
--[[Rails の自動読み込みの話 - そんなこと覚えてない:http://blog.eiel.info/blog/2013/09/07/autoload-rails/]]
--[[Auto-loading lib files in Rails 4 - Stack Overflow:http://stackoverflow.com/questions/19098663/auto-loading-lib-files-in-rails-4]]
-ただし、クラス名やモジュール名を明示的に参照しないと発生しないので、rbファイルに定義されたメソッドをいきなり使おうとしてもだめかもしれない(既存クラスを拡張したい場合など)。
#pre{{
Hoge       -> 'hoge.rb' を読み込む
Hoge::Mogu -> 'hoge/mogu.rb' を読み込む
HogeMogu   -> 'hoge_mogu.rb' を読み込む
}}

**開発環境で広告を表示しない [#k25cd98d]
-[[ruby on rails - Hide Adsense on localhost - Stack Overflow:http://stackoverflow.com/questions/1386195/hide-adsense-on-localhost]]

**ExecJSをインストールしたくない [#dd3e87c8]
-[[Railsを動かすproduction環境にJavaScriptエンジンを入れたくない - QA@IT:http://qa.atmarkit.co.jp/q/2123]]の下にある、precompileして送りこむのが簡単?
 rake assets:precompile 

**turbolinksを無効化する [#n1d7bbd1]
-[[Ruby - Rails 4 で turbolinks をオフにする方法 - Qiita:http://qiita.com/kazz187/items/12737363d62b9c91993c]]
-Gemfileから削除
-application.html.erb から turbolinks を削除。「"data-turbolinks-track" => true」を削除。
#pre{{
  <%= stylesheet_link_tag    "application", media: "all", "data-turbolinks-track" => true %>
  <%= javascript_include_tag "application", "data-turbolinks-track" => true %>
}}
-これに
#pre{{
  <%= stylesheet_link_tag    "application", media: "all" %>
  <%= javascript_include_tag "application" %>
}}
-application.jsからturbolinksを削除
#pre{{
//= require jquery
//= require jquery_ujs
//= require turbolinks <- 削除
//= require_tree .
}}

**jquery pluginを追加する [#ebb2d28c]
-gemファイルとなっているもの(〜-rails的なもの)はそのままGemfileとして追加できる。
-そうでないものはassets/javascripts以下にファイルを設置し、appliction.jsで読み込ませる

**モデルやコントローラーからActionView::Helpers::TextHelperに登録されているメソッドを呼び出す [#f77e9293]
-[[Railsでview以外、Controller内でhelperを使えるようにする - satoko's blog - s21g:http://blog.s21g.com/articles/682]]より、
-使いたいクラス内でincludeする。
     include ActionView::Helpers::TextHelper

**Rails/Rubyのバージョンを表示する [#c2be9793]
-Railsのバージョンは、Rails.versionを使う。[[Print Rails version in views? - Stack Overflow:http://stackoverflow.com/questions/8682378/print-rails-version-in-views]]
 <%= Rails.version %>
-RubyのバージョンはRUBY_VERSIONを使う
 <%= RUBY_VERSION %>

**トップページを作成する [#ede7242a]
-普通にcontrollerとviewを作成すれば良い。
-routes.rbでルートを設定。
#pre{{
  # You can have the root of your site routed with "root"
  root 'welcome#index'
}}
-welcome_controller.rbを作成
#pre{{
class WelcomeController < ApplicationController
  def index

  end
end
}}
-welcome/index.html.erbは適当に。

**IDにドットを含めることができない [#fc1714dd]
-[[ruby on rails - Why do routes with a dot in a parameter fail to match? - Stack Overflow:https://stackoverflow.com/questions/5369654/why-do-routes-with-a-dot-in-a-parameter-fail-to-match]]にあるように、デフォルトではIDにドットを含む文字列を指定することはできない。
-ブログのようにslugを指定してそれをIDとして利用している場合、slug入力時にドットが含まれているかどうかのチェックが必要。それかIDの正規表現を指定してドットを入れられるようにするか。

**IDのかわりに任意の文字列を使用する [#x20026ef]
-通常状態では"/users/1"のようにIDがパスに含まれる。
-IDをユーザー名に変更したい場合user.rbにto_paramを追加する。
#pre{{
class User < ActiveRecord::Base
  def to_param
    username
  end
end
}}
*設定 [#t9020c9a]

**初期設定 [#p8692cd3]
-[[Railsの設定 | Rails日本語ドキュメント | Ruby STUDIO:https://ruby.studio-kingdom.com/rails/guides/configuring]]によると、以下の順番で初期化される。
--config/application.rb
--環境特有の設定ファイル(development.rb、production.rb)。
--initializers
-つまり「cofnig=」で各環境共通の設定を行いたい場合、application.rbに書けばよいことになる。例えば以下のように。
#pre{{
    config.time_zone = 'Tokyo'
    config.active_record.default_timezone = :local
}}
**ちょっとした定数を保存したい [#g6e9ca54]
-[[ruby - Where to define Rails app's version number - Stack Overflow:http://stackoverflow.com/questions/11199553/where-to-define-rails-apps-version-number]]によると、config/initializers/version.rbに以下のファイルを作成する。
#pre{{
module MySite
  class Application
    VERSION = "0.0.4"
  end
end
}}
-別にファイルを分けなくてもapplication.rbに直接書いてもいいかも?
#pre{{
module MySite
  class Application < Rails::Application
    VERSION = "1.1.0"
  end
end
}}
**ちょっとした設定値を保存したい [#wef17e2e]
-development / productionごとに異なる設定値を保存する方法。[[ruby - Where can I store site-wide variables in Rails 4? - Stack Overflow:http://stackoverflow.com/questions/20857886/where-can-i-store-site-wide-variables-in-rails-4]]にあるように、development.rbで以下のように定義し、
 config.my_special_value = 'val'
-次のように参照するのが簡単か。
 Rails.application.config.my_special_value
-method_missingで勝手に値が保存される。

**ちょっとした設定値をDBに保存したい [#ke4fd182]
***[[rails-settings-cached]] [#sc76e172]


**サブディレクトリでPHPアプリを動かしたい [#v65dfcb1]
-ルートがrailsだけど例えばWordPressとかWikiをサブディレクトリで動かしたい場合。
-Railsでどうにかするのではなく、連携しているApache側(Webサーバー側)で設定すれば良い)。
-[[RailsとWordPressの共存するように変更してみた - masalibの日記:http://masalib.hatenablog.com/entry/2012/08/05/030628]]が参考になる。PassengerRubyを設定しているVirtualHost設定の内部に以下のように追加する。
#pre{{
    Alias /wiki /home/sora/www/wiki
    <Directory /home/sora/www/wiki>
       	PassengerEnabled Off
        AllowOverride All
    </Directory>
}}


*ビュー [#jc904d18]
**link_toの引数展開 [#dc3b6946]
-[[Rails - link_to の引数と展開の違いまとめ - Qiita:http://qiita.com/somewhatgood@github/items/9890e75b4c195d47715a]]


**ツリービューを組み込む [#v389e135]
-Rails4の場合[[jsTree]]がいいかも。
*ログ [#fbdf2f39]
**assetログを抑制する [#w4c26cc8]
-[[RailsでjsやcssなどassetsファイルへのGETでログが見辛い場合の対処法 - Qiita:http://qiita.com/marqs/items/70588084a87fd0cb164e]]


*データ [#i336b693]

**ステージング環境の追加 [#o06f16e9]

※設定が煩雑になるのでステージング環境(staging.rb)は追加しないほうが良いかも。

-[[RailsのRAILS_ENVに自分の環境を追加する - Qiita:http://qiita.com/t_oginogin/items/181a45bfb17fede1655d]]
-[[Rails に新たな env を追加する方法 - Qiita:http://qiita.com/yusabana/items/a1f4fe2c37b20db2a3f6]]
-development / production / test以外のカスタム環境を追加する。例えばstaging環境を追加する場合。
-confg/environments/staging.rbを作成(通常production.rbをコピーする)
-config/database.ymlにstating環境用の設定を追加(通常production設定をstagingにコピーする)。config/secrets.ymlも同様。
-以下のコマンドを実行
#pre{{
$ bundle install
$ bundle exec rake db:migrate RAILS_ENV=staging
$ bundle exec rails s -e staging
}}

**ステージング環境を追加しない [#fc1c9f34]
-設定が煩雑になるのでステージング環境は追加しないほうが良いという説がある。
-[[config/environments/staging.rb はアンチパターン! - Qiita:https://qiita.com/tonluqclml/items/196280783bbefbd9ac76]]
-[[Railsのenvでステージング用の値は増やせるがあんまり増やさない方がいいという話 - コード日進月歩:https://shinkufencer.hateblo.jp/entry/2019/08/10/000000]]
-[[Rails.env.md:https://gist.github.com/pocke/21a3ce8fbc1cd27e63cee328bcdcc5a8]]

そのかわりに環境変数を使用する。

-パターン1: 環境変数フラグで切り分け。
#pre{{
if ENV[API_MOCKING_FLG] == 1
  # APIのモック処理
else
  # 通常のAPI処理
end
}}
-パターン2: 設定を外だし。
#pre{{
production:
  adapter: mysql2
  encoding: utf8
  pool: 5
  socket: /tmp/mysql.sock
  database: <%= ENV['DATABASE_SCHEMA_NAME'] %>
  host: <%= ENV['DATABASE_HOST'] %>
  username: <%= ENV['DATABASE_USER_NAME'] %>
  password: <%= ENV['DATABASE_PASSWORD'] %>
}}
**初期データ投入(seeds.rb) [#u599c907]
db:seedを使ってデータを投入できる。
-db/seeds.rbを編集する。
#pre{{
Book.create(title: "title1", author: 'author1', summary: 'summary1')
Book.create(title: "title2", author: 'author2', summary: 'summary2')
}}
-rake db:seedを実行する。
 bundle exec rake db:seed RAILS_ENV=development

-再投入の場合は rake db:resetだけで良い。db:seedもまとめてやってくれる。
 bundle exec rake db:reset RAILS_ENV=development
**データベースのリセット/データの再投入 [#z713e7c0]
-db:resetがお手軽(db:reset = db:drop db:setup、db:setup=db:create db:schema:load db:seed)。[[Rails - データベースリセット - Qiita:http://qiita.com/m_ryou/items/3a0ca3d83fa4b329b979]]
 bundle exec rake db:reset RAILS_ENV=development
-db:resetとdb:migrate:resetの違い。[[【Rails】db:reset と db:migrate:reset の違い - naichi's lab:https://blog.naichilab.com/entry/db_reset-vs-db_migrate_reset]]
**サンプルデータの作成 [#oa5e3fe4]
-[[Ruby on Railsでサンプルデータを登録するRakeタスクの作成方法 - ztbuz@dev:http://ztbuz.hateblo.jp/entry/2013/12/31/214628]]にあるようにrakeタスクを作成しそこからデータを登録する。


**機密情報の保存 [#x0372579]
-データベースのパスワードやAPIのアクセスキーをどうやって保存するかという問題。以下の方法がある。
--direnv: シェルで環境変数を切り替える方法。シェルを使わないIDEだと使えない?
--dotenv: 設定ファイルを別途準備しそれを読み込むRubyスクリプト。本番環境で使わないほうがいいという話もある。[[Dotenvはproductionで使わないほうがよいのではという話 - なんかかきたい:http://t-cyrill.hatenablog.jp/entry/2015/03/25/024625]]
-結局どれも一長一短ある。公開リポジトリを使わず、リポジトリの安全性が担保されているなら、パスワード毎コミットしてしまうのが一番簡単かも。

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS