リリース前はHerokuであっても公開したくないお客様も多いのでいつも書くやつ。
class ApplicationController < ActionController::Base
http_basic_authenticate_with name: "user", password: ENV["BASIC_AUTH_PASSWORD"] if Rails.env.production? || Rails.env.staging?
end
リリース前はHerokuであっても公開したくないお客様も多いのでいつも書くやつ。
class ApplicationController < ActionController::Base
http_basic_authenticate_with name: "user", password: ENV["BASIC_AUTH_PASSWORD"] if Rails.env.production? || Rails.env.staging?
end
全てのrailsアプリに入れてるmeta-tags gemですが、デフォルトでmeta keywordsの中身を小文字にします。
日本語的には(Aクラス → aクラスなど)小文字にされると困るので、必ず下記を設定。
# config/initializers/meta_tags.rb:
MetaTags.configure do |config|
config.keywords_lowercase = false
end
この設定最近のバージョンで追加されたようなので皆さんチェックしてみてください。
class UsersController < ApplicationController
...
def user_params
params.require(:user).permit(
:email,
:first_name,
:last_name,
:first_name_kana,
:last_name_kana,
:profile
)
end
end
こんな風にpermitするparameterがたくさんある時、
class UsersController < ApplicationController
...
def user_params
params.require(:user).permit(%i(
email
first_name
last_name
first_name_kana
last_name_kana
profile
))
end
end
こう書くと増減した時のメンテが楽。
テスト用のfixturesとseedデータを$ rails db:fixtures:load
を使うことによって共通化する方法です。
db/seed.rb
にこう書く。
# db/seed.rb:
Rake::Task["db:fixtures:load"].execute
Q. factory_girlの場合は?
A. factory_girlは素人にはおすすめできない。まずはRailsデフォルトのfixturesを使いこなしましょう。
Q. seed-fuは?
A. 窓から捨てましょう。
Q. 画像ファイルがseedに必要な場合は?
A. 良い質問です。こちらを参考にしてください。
よくある下記のようなアカウント編集ページをdeviseで作る場合。
こんな感じでresource.update_without_passwordを使い分ければOK。
# app/controllers/registrations_controller.rb:
class RegistrationsController < Devise::RegistrationsController
protected
def update_resource(resource, params)
if params[:password].present? && params[:password_confirmation].present?
resource.update_attributes(params)
else
resource.update_without_password(params)
end
end
end
簡単だけどdeviseのWikiには載ってないようなので。
db:fixtures:loadを使えばseed-fuなどを使った場合に起きるseedデータとテストデータの二度書きの手間無くなります。
しかし、paperclipで画像を保存してる時など、fixturesからは読み込めないものを保存している場合に対応できません。
僕は下記のようにして解決しています。
db:image:load
という画像をアップするtaskを書く。
# lib/tasks/fixtures.rake:
namespace :db do
namespace :images do
desc "Upload images."
task load: :"db:fixtures:load" do
User.all.each do |user|
path = Rails.root.join("test", "fixtures", "files", "users", "avatars", "#{user.name}.jpg")
user.update!(avatar: open(path)) if File.exist?(path)
end
end
end
end
# lib/tasks/fixtures.rake:
...
Rake::Task["db:fixtures:load"].enhance do
Rake::Task["db:images:load"].execute
end
これでrails db:fixtures:load
すればその後で画像も入ります。
PaperclipでGoogle Storageに画像を保存しているときに表示がクッソ遅い。
原因は表示するたびにファイルの存在確認のリクエストを出しているためで、1ファイルにつき200msぐらい遅くなってた。(30個の表示で計6秒遅くなってた)
対応方法は、fog_hostを設定しておけばリクエスト出さなくなるようで、普通の速度に戻りました。
config/initializers/paperclip.rb:
Paperclip::Attachment.default_options[:fog_host] = "http://#{ENV["GOOGLE_STORAGE_BUCKET_NAME"]}.storage.googleapis.com"
deviseのconfirmable
モジュールを使うとデフォルトでemailを変更するときに再確認メールを送信する。
(これがサインアップ時のメールと同じ内容なので使い辛いというのは別の話)
設定でオフにできる。
config/initializers/devise.rb:
Devise.setup do |config|
config.reconfirmable = false
end
class Comment < ApplicationRecord
belongs_to :user
belongs_to :post
alias_method :sender, :user
def reciever
post.user
end
end
こうしておくとメール送るときにわかりやすい。
if comment.sender != comment.reciever
NoticeMailer.recieved_comment(@comment).deliver_later
end