Ruby on Rails 初心者つまづきやすいポイントまとめ

rails に関する初心者(私)がつまづきがちなポイントをまとめました。

目次

  1. stylesheet import仕方
  2. 改行を自動でおこなってくれるsimple_format
  3. パーシャル(共通部分)
  4. deleteアクション
  5. フラッシュを使用したページの作り方
  6. アソシエーション
  7. ストロングパラメーター フィルター
  8. バリデーションの設定
  9. 対多 多対多(tag付) の関係
  10. heroku ダウンロードからrailsとの関連付
  11. 本番環境でpostgresqlをgemに追加する方法
  12. キーワード引数



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