Rspec コードメモ
・通常の書き方(factory-girlなし) user_spec.rb
require 'rails_helper' describe User do describe '#create' do it "is invalid without a email" do #ここはテストの条件式。今回の条件はemailがないと無効になるか user = User.new(nickname: "abe", email: "", password: "00000000", password_confirmation: "00000000") #インスタンスの生成。emailはからの設定 user.valid? #インスタンスを保存する際に「バリデーションにより保存ができない状態であるか」を確かめる expect(user.errors[:email]).to include("can't be blank") #errorsメソッドを利用すると、バリデーションにより保存ができない状態である場合なぜできないのかを確認することができる end end end
・factory-girlあり
require 'rails_helper' describe User do describe '#create' do it "is invalid without a email" do #ここはテストの条件式。今回の条件はemailがないと無効になるか user = User.build(:user, nickname: "") #factory-girlを使い、buildメソッドで記述を省略 user.valid? #インスタンスを保存する際に「バリデーションにより保存ができない状態であるか」を確かめる expect(user.errors[:nickname]).to include("can't be blank") #errorsメソッドを利用すると、バリデーションにより保存ができない状態である場合なぜできないのかを確認することができる end end end
rspec エラーまとめ
・エラー文
Web Console is activated in the test environment, which is usually a mistake. To ensure it's only activated in development mode, move it to the development group of your Gemfile: gem 'web-console', group: :development If you still want to run it the test environment (and know what you are doing), put this in your Rails application configuration: config.web_console.development_only = false
・以下を参考に解決を試みる stonebeach-dakar.hatenablog.com
手順1
config/application.rb
config.web_console.development_only = false
以上を追加
手順2
gemfile
gem 'web-console', '~> 2.0'
しかし、以上ではうまくいかなかった。
・他の原因
DBを作っていなかったことをがわかり、作成。
すると、
Running via Spring preloader in process 3663 User #create is invalid without a nickname Finished in 0.00178 seconds (files took 4.23 seconds to load) 1 example, 0 failures
かんせー
レビュー反省 2016 12 20
・permitでuser_id、group_idを許すのか、mergeでuser_id、group_idを加えるのかどちらかにしましょう。
params.require(:message).permit(:message, :user_id, :group_id).merge(user_id: current_user.id, group_id: params[:group_id])
・elseの後、改行しましょう
if @message.save!
redirect_to group_path(@group)
else
redirect_to :back, alert: 'メッセージを入力してください'
こうするといい。
・save!は保存に失敗したときに例外を発生させます。単純にfalseが返ってきて欲しい時はsaveを使いましょう
・現在はchatの画面をgroups_cpntrollerのshowで実装していると思います。しかし、chat画面はmessageの一覧が表示されていると考えてmessages_controllerのindexを使って実装する方が良いかなと思います。
ルーティングでmessageをネストしているのでmessages_controllerでもgroup_idを使うことができます。そのgroup_idを使ってグループを取得し、関連付けられたメッセージを一覧で表示してみましょう。
messageコントローラにて、投稿されたmessageの表示を行うようにする。
やり方
1、messageコントローラにindexアクションを作る。
2、中身を作る。役割は以下のとおり。
def index
@group = Group.find(params[:group_id]) #グループのページにアクセスした時に、そのグループの番号を受け取る
@messages = @group.messages #上で受け取ったグループの番号に関連したmessageテーブルの値を取得する
@message = Message.new #form_forに入力される値を受け取るための箱を用意する
end
3、viewをmessagesフォルダに作る。viewで使っている変数で変える必要がある部分は変える。
・changeについて
コミットのメッセージで迷うから。
・リダイレクトの際に、いちいち変数でgroup_idを取得して飛ばす必要はない。
def create
message = Message.new(create_params)
group_id = params[:group_id] #リダイレクトをするために、現在のページのgroup_idを取得する
if message.save
redirect_to group_messages_path(group_id)
これを・・・・・・・・・
redirect_to group_messages_path(params[:group_id])
こうする。
レビューの反省 2016 12 19
・@groupだとgroupのインスタンスが入っている様に見えてしまうので変数名を変えましょう
def create
@message = Message.new(create_params) #入力された値を保存する
@group = params[:group_id] #リダイレクトをするために、現在のページのgroup_idを取得する
・save!は保存に失敗したときに例外を発生させます。単純にfalseが返ってきて欲しい時はsaveを使いましょう
参考
・elseの後、改行しましょう
@group = params[:group_id] #リダイレクトをするために、現在のページのgroup_idを取得する
if @message.save!
redirect_to group_path(@group)
else redirect_to :back, alert: 'メッセージを入力してください'
・permitでuser_id、group_idを許すのか、mergeでuser_id、group_idを加えるのかどちらかにしましょう。
def create_params
params.require(:message).permit(:message, :user_id, :group_id).merge(user_id: current_user.id, group_id: params[:group_id])
レビュー反省 2016 12 18
・シンボル型での記述をメインで使うこと
render 'edit' より、render :editなどの方が見やすい。
%p #{current_user.name}ではなく、%p= current_user.nameで書く。
・レビューを受けた際は同じような記述が他にもないか必ず確認しましょう!
・prefixを使用してパスを指定する場合はedit_group_path(@group)というように.idを省略して書くことが出来ます。
EX
= link_to 'Edit', edit_group_path(@group.id) を = link_to 'Edit', edit_group_path(@group) にする
rails 部分テンプレートの使い方 まとめ
1、部分テンプレートの作り方
_ファイル名.html.haml(or erb)
これを使いたいコントローラーが管理するviewフォルダにいれる。
2、部分テンプレートの呼び出し方
= render partial: "1で作った「ファイル名」の部分"
部分テンプレートの内容を繰り返し表示させる場合は、collection: @変数名
追記 = render "group" に省略することができた。
EX
= render partial: "group", collection: @groups
追記 partial: の指定は無くてもよかった。
参考
Railsでパーシャルを使って、似たようなコードを共通化したい | Ruby on Railsサービス開発逆引き辞典