rails に関する初心者(私)がつまづきがちなポイントをまとめました。
目次
- stylesheet import仕方
- 改行を自動でおこなってくれるsimple_format
- パーシャル(共通部分)
- deleteアクション
- フラッシュを使用したページの作り方
- アソシエーション
- ストロングパラメーター フィルター
- バリデーションの設定
- 対多 多対多(tag付) の関係
- heroku ダウンロードからrailsとの関連付
- 本番環境でpostgresqlをgemに追加する方法
- キーワード引数
rails stylesheet importの仕方
stylesheet注意点
stylesheet > application.scssに
@import "{scssファイル名}"
とすることでviewsに反映させる。
rails 改行を自動でおこなってくれるsimple_format
railsのshowアクションを実行する際、データベースから送られたhtmlの改行の部分がそのまま出力されるのを自動で変換してくれるます。
[例]
<p>
<%= simple_format(@インスタンス変数.title)%>
</p>
rails パーシャル(共通部分)
パーシャルとは共通に使われる部分をまとめてるファイルになります。
よく使われるのがフォーム部分で、
_form.html.erbのようにアンダースコアをはじめにつけるルールがあります。
そのパーシャルにした部分を使うには、
<%= render partial: "form" %>
を入れ込むと使えます。
パーシャルを作成する際、注意する点はインスタンス変数を使っているという点で
<%= render partial: "form",locals:{sumble:@sumple} %>
のようにインスタンス件数からローカル変数に変えわかるように変更します。
こうすることでインスタンス変数が変更されても影響されないようにします。
他にも方法があり、
<%= render partial: "form",object:@sumple %>
とすることでパーシャル名と同名のローカル変数が作成されます。
モデルのオブジェクトのページではより簡略に
<%= render @{モデル名} %>
とするだけで反映されます。
rails deleteアクション
<%= link_to "削除",{ローカル変数},method: :delete %>
とメソッドにデリートを指定することで、削除ボタンがクリックされたときに
_method=deleteというパラメータが送信され疑似的にデリートアクションが実行されます。
rails フラッシュを使用したページの作り方
def create
flash[:notice] = "メッセージ"
end
[show.html.erb]
<% if flash[:notice]%>
<div class="alert alert-primary"><%=flash[:notice]%></div>
<%end%>
redirect_toの設定でnoticeを表示する方法
[controller]
def delete
@model.delete
redirect_to model_path,flash:{notice:"メッセージ"}
end
↓
[index.html.erb]
<%if flash[:notice]%>
<div class="alert-danger><%=flash[:notice]%></div>
<%end%>
これでフラッシュが発生します
rails アソシエーション
紐づけるmodelを作成するやり方
$ rails g model {model名}:references name:string comment:text
このreferencesを設定することで、model_idカラムを自動で紐付けしてくれます。
create_table :model名 do |t|
t.references :model名,foreign_key: true
t.string :name,null: false ←このnull: falseを追記することで空文字が入力されてもエラーで返してもらえます
t.text :comment,null: false
t.timestamps
end
最後に、
$ rails db:migrate
[app/models/model名.rb]
class Model名 < ApplicationRecord
has_many :model名(複数形)
end
これで完了です。
rails ストロングパラメーター フィルター
[controller.rb]
private
def sumple_params do
params.require(:{モデル名}).permit(:name,:title,:body)
end
とすることでpermitで指定されたキーのみが取得されます。
[controller.rb]
private
def set_target_model
@model = Model.find(params[:id])
end
とし、class直下に
beforeaction :settargetmodel,only[:show,:edit,:update,:destroy] ←onlyとするのにはすべてのアクションの前にじっこうされるとidがわたってこないアクションにはエラーになってしまうためです。
これができたらcontroller内の記述を削除します。
rails バリデーションの設定
class Model << ApplicationRacode
validates :name,presence: true,length: {maximum: 10}
validates :title,presence: true,length: {maximum: 30}
validates :body,presence: true,length: {maximum: 1000}
end
presenceで入力がなければエラーを返します。
エラー表示をフラッシュで返す方法、
[class modelscontroller << ApplicationController]
def create
model名 = model名.new(ストロングパラメーターparams)
if model名.save
flash[:notice] = "メッセージ”
redirect_to model(ローカル変数)
else
redirect_to new_model_path,flash{
model: model(ローカル変数),
error_message: model.errors.full_messages
{
end
end
newメソッドにredirectすると入力したフォーム等のデータが消えてしまうためフラッシュでmodelオブジェクトも返しています。
次に、フラッシュでエラーメッセージを出力させるように
[_form.html.erb](パーシャルなど)
<%if flash[:error.message]%>
<div class="alert alert-denger">
<ul>
<%= flash[:error_message].each do | msg | %>
<li><%=msg%></li>
<%end%>
</ul>
<div>
<%end%>
エラーメッセージはそのままだと英語表記になるのでおすすめのgemが[rails-i18n]です
[Gemfile]
gem "rails-i18n"
↓
[ターミナル]
$ bundle install
nameやtitleなどはそのまま英語表記なので、
[config/locales/ja.yml]を作成し
ja:
activrecord:
attributes:
model名:
name: 名前
title: タイトル
body: 本文
これでエラーメッセージが日本語表記になります。
rails 1対多 多対多(tag付) の関係
イメージ
1 (has many)→ 多 多 (belongs to) → 1
便利なgemに「annotate」というのがあります。
これはモデルの構造を見やすくしてくれるgemで
[gemfile]
group :development do
gem "annntate"
end
[ターミナル]
$ bundle install
自動でannotateが実行されるように
$ rails g annotate:install
とすることで、マイグレーションをするたび自動でおこなってくれます。
多対多の場合
$ rails g model tag name:string
$rails g model tag_reration {タグ付するmodel名}:references tag:refarences
$rails db:migrate
belongs_to :{タグ付するmodel名} ←単数になっていることに注意
belongs_to :tag ←単数になっていることに注意
class Tag < ApplicationRecord
has_many :tag_rerations ←複数形に注意
has_many :{タグ付するmodel名}s,throuth: :tag_rerations
end
throughを設定することで中間テーブルにいなるtag_rerationsを経由してタグ付するmodel名に関連づけるための設定になります。
タグ付するmodel名にも関連づける設定をします。
class Model名 < ApplicationRecord
has_many :tag_rertions
has_many :tags, through: :tag_rerations
end
次に、タグ付に関連するデータを削除する方法が
class Model名 < ApplicationRecord
has_many :tag_rertions,dependent: :delete_all ←dependentオプションを追記
has_many :tags, through: :tag_rerations,dependent: :delete_all ←dependentオプションを追記
end
このdependentで削除する方法はdestroyアクションによって実行されます。
よって
[controller]
def destroy
model名.delete ←このdeleteの部分をdestroyに変更する
end
これで設定は完了です。
heroku ダウンロードからrailsとの関連付
ターミナル
$ curl -OL http~~ [linux *64]
圧縮ファイルの解凍
$ tar zxf heroku-linux-x64.tar.gz
解凍したファイルをローカルに移動
$ sudo mv heroku /usr/local/
.bash_profileに設定
$ echo "PATH=/user/local/heroku/bin:$PATH" >> $HOME/.bash_profile
$source $HOME/.bash_profile
$heroku -v
で確認、
最後に
$rm -f heroku-linux-x64.ter.gz
でファイルを削除し終了
railsとherokuの関連付けをするには
$heruku create [アプリ名]
デプロイの仕方
$git push heroku master
エラーがでたとき
$ bundle lock --add-platform x86_64-linux
$ git add .
$ git commit -m "メッセージ"
$ git push heroku master
マイグレートする
$heroku run rails db:migrate
migrateできたら、urlの確認
$heroku apps:info
rails 本番環境でpostgresqlをgemに追加する方法
herokuでデプロイするためにデータベースの設定を変更する。
sqlite3 => postgresql
Gemfile
group :production do
gem "pg","~>0.18.4"
end
デベロッパー環境ではsqlite3で開発を進めるためバンドルするには
ターミナル
$ bundle install --without production
とし、herokuの場合のみproductionのpostgresqlを使用するように設定する
次に、
config > databese.ymlの設定
production
<<:*default
adapter:postgresql
encoding: unicode
次に、assetのコンパイルを有効にする設定
config > environments > production.rb
config.assets.compile =true
trueに変更する
キーワード引数
Rubyのキーワード引数がわかりにくかったので自分用にまとめました。
メソッドはRuby2.0からPythonのようにキーワード引数を定義できるようになったとのことで、キーワード引数はメソッドに引数を(キー:値)という形で設定します。
このとき値に何もいれてないとエラーがでます。
【例】
def sumple(key1:"value1",key2:"value2")
puts "${key1}:#{key2}"
end
sumple()
value1:value2
となります。value1,value2はデフォルト値になっているので変更可能で、
このメソッドに引数をいれて実装してみると
sumlple(key1:"hoge",key2:"fuga")
すると
hoge:fuga
となります。
次に引数を増やしてデフォルト値をいれずに
def sumple(key1:"value1",key2:"value2",key3:)
puts "${key1}:#{key2}:#{key3}"
end
sumple()
実装すると、
missing keyword:key3(ArgumentError)
となりエラーになりますが、
値を入れて実装すると
def sumple(key1:"value1",key2:"value2",key3:)
puts "${key1}:#{key2}:#{key3}"
end
sumple(key3:"value3")
value1:value2:value3
となりきちんと実行されました。
仮引数のままメソッドを実行することが多いですが、実引数の位置を間違えることも多いですよね。
そんなとき、この「キーワード引数」の出番となります。
ruby initializeメソッド
newで呼び出したとき、インスタンスに変数を使って値を保持するやり方
class User
def initialize(name)
@name=name
end
def say
puts "hello,#{@name}"
end
sam = User.new("sam")
sam.say
結果
hello,sam