Railsでアプリ制作
何度も作るうちになんとなくわかってきたので、自分の学習記録として残しておきます。
勉強中のため、間違っている部分があれば教えてください。
rails newで必要なファイルを作成
Dangoというアプリ制作
rails new Dango --skip-bundle
Herokuでデプロイする時のことを考えて、
--skip-bundle
オプションをつける
つけないと、GemがPCのシステムにinstallされる
(複数のアプリを作成する場合は指定しないとエラーの元となる)
cd Dango
アプリのディレクトリへ移動
bundle install --path vendor/bundle
Railsで扱うGemを個々のアプリに分けて扱える
アプリを作成する時はbundle install --path vendor/bundle
でGemをインストールすることでアプリごとにGemを自動で切り替えてくれる
初めに開くページを作成(Top)
URLをクリックしたあとに最初に表示されるページを作成する
rails g controller home top
homeコントローラー作成
topアクション、それに対するview、routes.rbにget home/top
ができる
get 'home/top' < 削除 >
root to: 'home#top' < 追記 >
root to: 'home#top'
に書き換える
<h1>このページはルート</>設定しているのでURLの最初のページです</h1>
分かりやすいように書き直しました。書き直さなくても大丈夫です。
rails s
rails s
で動作確認
このページはルート</>設定しているのでURLの最初のページです
が表示されていればOK
Question モデル作成
rails g model Question title:string body:text
Question
は単数にすること
それぞれのデータがあるため、一つ一つという意味らしい
rails db:migrate
これをしないとデータベースが作成されない
しないとエラーになる
Questionコントローラー作成
一覧ページ index
詳細ページ show
作成ページ new
保存アクション create
編集ページ edit
更新アクション update
削除アクション destroy
question controller作成
rails g controller questions index show new edit
questions
は複数にすること
Questionコントローラー作成
保存、更新、削除は画面には表示する必要がないため、後で直接コントローラー内に追記する。
保存、更新、保存はデーターベースの変更のためそのページを表示するのではなく、データーベースを変更する処理のみでよい
routes.rb変更
root to: 'home#top'
resources :questions < 追記 >
index
class QuestionsController < ApplicationController
< 追記 >
def index
@questions = Question.all
end
end
<h1>ここはQuestion indexのページです</h1>
<ul>
<% @questions.each do |q| %>
<li><%= q.title %></li>
<li><%= q.body %></li>
<% end %>
</ul>
<%= q.title %>
<%= q.body %>
で表示できる
show
class QuestionsController < ApplicationController
< 追記 >
def show
@question = Question.find(params[:id)
end
end
<h1>ここはQuestion showのページです</h1>
<table>
<thead>
<tr>
<td>Title</td>
<td>Body</td>
</tr>
</thead>
<tbody>
<tr>
<td><%= @question.title %></td>
<td><%= @question.body %></td>
</tr>
</tbody>
</table>
<%= @question.title %>
<%= @question.body %>
で表示できる
new & edit
class QuestionsController < ApplicationController
< 追記 >
def new
@question = Question.new
end
def create
@question = Question.new(question_params)
if @question.save
flash[:notice] = 'Question was successfully created.'
redirect_to question_path(@question)
else
render 'new'
end
end
def edit
@question = Question.find(params[:id])
end
def update
@question = Question.find(params[:id])
if @Question.update(question_params)
flash[:notice] = 'Question was successfully updated.'
redirect_to question_path(@question)
else
render 'edit'
end
end
private
def question_params
params.require(:question).permit(:title, :body)
end
end
private以下の
question_params
はストロングパラメーター
といい安全なデータかを検証してくれるものです
create, updateで失敗したら
render
でそれぞれnew
とedit
のフォームを表示するようにしています。
new editについてはフォームヘルパー
というものを利用する
_form.html.erb
というものを作成することでコードが見やすくなる
_form.html.erbを作成する
<%= form_for @question do |f| %>
<label>Title</label>
<p>
<%= f.text_field :title %>
</p>
<label>Question</label>
<p>
<%= f.text_area :body %>
</p>
<p>
<%= f.submit %>
</p>
<% end %>
new.html.erbとedit.html.erbについて以下のようにする
<h1>ここはQuestion newのページです</h1>
<%= render 'form' %>
<h1>ここはQuestion editのページです</h1>
<%= render 'form' %>
<%= render 'form' %>
とすることで_form.html.erb
のviewがrenderされて表示される
renderとはviewを表示したい時に使用される
validatesを設定する
質問投稿ができても、それが必ず文字で埋まってるという可能性は少ない。そこであらかじめ、空の文字
を保存できないように設定することができる。
ここで説明するのは基本的なものなので
rails validates
などと調べることで色々出てきます。
class Question < ApplicationRecord
validates :title, presence: true < 追記 >
validates :body, presence: true < 追記 >
end
validatesに失敗した時のエラーメッセージ表示
_form.html.erb
に以下追記
<%= form_for @question do |f| %>
------------ここから-------------
<% if @question && @question.errors.any? %>
<%= @question.errors.count %>errors prohibited this obj from being saved:<br>
<ul>
<% @question.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>
</ul>
<% end %>
------------ここまで-------------
<label>Title</label>
<p>
<%= f.text_field :title %>
</p>
<label>Body</label>
<p>
<%= f.text_area :body %>
</p>
<p>
<%= f.submit %>
</p>
<% end %>
今回は、rails new
からquestions controller
、question model
までを紹介しました。
今後は、ユーザー登録、紐付けなど自分が整理出来次第投稿します。
勉強中のため、説明や記述など間違いがありましたら教えてください。
今後したいこと
- herokuデプロイ紹介
- gem 'devise'関連
- 紐付け関連