rails new profile
cd profile
rails s #localhost3000で起動の確認
#ログイン機能実装
rails g controller comments index
login_app/config/routes.rb
Rails.application.routes.draw do
root 'comments#index' # ここを追記します
get 'comments/index' # 自動で設定されたルーティング
devise_for :users
end
login_app/gemfile
gem 'devise' #適当に挿入
bundle install
次はdiviseを利用するのに必要なファイルを作成しましょう
rails g devise:install
config/environments/development.rb
config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
#上の方にはりつけ
app/views/layouts/application.html.erb
<p class="notice"><%= notice %></p>
<p class="alert"><%= alert %></p>
これを、<%= yield %>の直前に追記します。
rails g devise user #ログイン機能用のモデルを作成
rake db:migrate #マイグレート
rails g devise:views #ログイン機能に必要なビューファイルをまとめて作成
views/comments/index.html.erb
<h1>ログインアプリ</h1>
<% if user_signed_in? %> <!-- ユーザーがログインしているか調べる -->
<!-- ユーザーがログインしていた時の処理 -->
<h4> メールアドレス: <%= current_user.email %> </h4>
<%= link_to "ログアウト", destroy_user_session_path, method: :delete %> <!-- ログアウトをする -->
<% else %>
<!-- ユーザーがログインしていなかった時の処理 -->
<h2> 現在ログインしていません </h2>
<%= link_to "新規登録", new_user_registration_path, class: 'post' %> <!-- 新規登録画面に移行する -->
<% end %>
もとのやつ消して、すべて貼りつけする
他のテーブルを作成する
rails g scaffold profile user_id:integer name:string age:integer address:string
rails g scaffold article user_id:integer profile_id:integer tittle:string content:string
#articleとprofileMのVCの作成
#親子関係を整える
model/user.rb
class User < ApplicationRecord
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable
has_one :profile
has_many :articles
end
model/profile.rb
class Profile < ApplicationRecord
belongs_to :user
has_many :articles
end
model/profile.rb
class Profile < ApplicationRecord
belongs_to :user
has_many :articles
end
model/article.rb
class Article < ApplicationRecord
belongs_to :user
belongs_to :profile
end
モデルの作成
rake db:migrate
#ログイン後にnew profileつくる
comments/index.html.erb
<%= link_to 'New Profile', new_profile_path %>
<% else %>
<% else %>の上にはりつけ
ブラウザで動作確認
#ログインユーザーで生成や編集ができるようにする
profiles_controller.rb
class ProfilesController < ApplicationController
before_action :set_profile, only: [:show, :edit, :update, :destroy]
before_action :authenticate_user!
# GET /profiles or /profiles.json
def index
@profiles = Profile.all
end
# GET /profiles/1 or /profiles/1.json
def show
end
# GET /profiles/new
def new
@profile = Profile.find_or_create_by(:user_id => current_user.id)
redirect_to edit_profile_url(@profile)
end
# GET /profiles/1/edit
def edit
if @profile.user_id != current_user.id
raise ActionController::RoutingError.new("Not authorized")
end
end
# POST /profiles or /profiles.json
def create
@profile = Profile.new(profile_params)
respond_to do |format|
if @profile.save
format.html { redirect_to @profile, notice: "Profile was successfully created." }
format.json { render :show, status: :created, location: @profile }
else
format.html { render :new, status: :unprocessable_entity }
format.json { render json: @profile.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /profiles/1 or /profiles/1.json
def update
respond_to do |format|
if @profile.update(profile_params)
format.html { redirect_to @profile, notice: "Profile was successfully updated." }
format.json { render :show, status: :ok, location: @profile }
else
format.html { render :edit, status: :unprocessable_entity }
format.json { render json: @profile.errors, status: :unprocessable_entity }
end
end
end
# DELETE /profiles/1 or /profiles/1.json
def destroy
@profile.destroy
respond_to do |format|
format.html { redirect_to profiles_url, notice: "Profile was successfully destroyed." }
format.json { head :no_content }
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_profile
@profile = Profile.find(params[:id])
end
# Only allow a list of trusted parameters through.
def profile_params
params.require(:profile).permit(:user_id, :name, :age, :address)
end
end
profiles/index.html.erb
<%= link_to 'New Article', new_article_path %>
1番最後の行に追加する
#Articleのuser_idが現在のログインしているuserのIDとする
articles_controller.rb
def new
@article = Article.new(:user_id => current_user.id)
end
user_idをフォームで変更できないようにする
articles/_form.erb
<div class="field">
<%= form.hidden_field :user_id %>
</div>
hidden_fieldに変更して、labelを外す