Ruby on Rails 入門6

やったこと

いろいろ微調整やったせいで、まとまりがない記事になった。。。。

devise用のviewを作成

画面をカスタマイズしたい場合はviewを作って、htmlやらを修正する必要があるためです

$ rails g devise:views users
     invoke  Devise::Generators::SharedViewsGenerator
     create    app/views/users/shared
     create    app/views/users/shared/_error_messages.html.erb
     create    app/views/users/shared/_links.html.erb
     invoke  form_for
     create    app/views/users/confirmations
     create    app/views/users/confirmations/new.html.erb
     create    app/views/users/passwords
     create    app/views/users/passwords/edit.html.erb
     create    app/views/users/passwords/new.html.erb
     create    app/views/users/registrations
     create    app/views/users/registrations/edit.html.erb
     create    app/views/users/registrations/new.html.erb
     create    app/views/users/sessions
     create    app/views/users/sessions/new.html.erb
     create    app/views/users/unlocks
     create    app/views/users/unlocks/new.html.erb
     invoke  erb
     create    app/views/users/mailer
     create    app/views/users/mailer/confirmation_instructions.html.erb
     create    app/views/users/mailer/email_changed.html.erb
     create    app/views/users/mailer/password_change.html.erb
     create    app/views/users/mailer/reset_password_instructions.html.erb
     create    app/views/users/mailer/unlock_instructions.html.erb
$

Modelの作成&修正

作成

$ rails g model Tweet user_id:integer content:text
     invoke  active_record
     create    db/migrate/20200225033720_create_tweets.rb
     create    app/models/tweet.rb
     invoke    test_unit
     create      test/models/tweet_test.rb
     create      test/fixtures/tweets.yml
$

修正は2ファイルで親子関係を定義します

app/models/tweet.rb

子テーブル

class Tweet < ApplicationRecord
 belongs_to :user #追記
end

app/models/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
 attachment :profile_image
 has_many :tweets #追記
end

Railsコマンド

データベースを反映

$ rails db:migrate
== 20200225033720 CreateTweets: migrating =====================================
-- create_table(:tweets)
  -> 0.0109s
== 20200225033720 CreateTweets: migrated (0.0145s) ============================

$

余談だけど、rake db:migrateとrails db:migrateどっちも同じような挙動だけどなんで?ってなった。バージョン5以降はどっちも一緒らしい。

Controllerの作成

$ touch app/controllers/tweets_controller.rb

app/controllers/tweets_controller.rb

class TweetsController < ApplicationController

 def create
   tweet = current_user.tweets.new(tweet_params)
   tweet.save
   redirect_to home_path
 end

 private
 def tweet_params
   params.require(:tweet).permit(:user_id, :content)
 end
end

config/routes.rb

Rails.application.routes.draw do
 get 'home' => 'home#index'
 root :to => 'home#index'
 devise_for :users, :controllers => {
   :registrations => 'users/registrations',
   :sessions => 'users/sessions'
 }
 resources :users, only: [:index, :show, :edit, :update]
 resources :tweets, only: [:create] # 追加
end

app/views/home/index.html.erb

<div class="main-container">
 <p id="notice"><%= flash[:notice] %></p>
 <div class="main-fields">
   <%= form_for @tweet do |f| %>
     <p><%= f.text_area :content, class: "textarea" %></p>
     <%= f.submit "ツイートする", class: "button is-primary main-botton" %>
   <% end %>
 </div>

 <div class="main-fields">
   <% @tweets.each do |tweet| %>
     <div>
       <%= simple_format(tweet.content) %>
     </div>
   <% end %>
 </div>
</div>

app/controllers/home_controller.rb

http://localhost:3000/home が叩かれたときにツイート取得などをするため修正

class HomeController < ApplicationController
 def index
   if user_signed_in?
     @user = User.find(current_user.id)
   end
   @tweets = Tweet.all.order(id: "DESC")
   @tweet = Tweet.new
 end
end

その他

機能作ってて色々と変えたい部分でてきてしまって、その点気になる方はGithubを参照していただけると幸いです。(記事にするとめっちゃ長くなってしまうため。。。↓今回時点のコミットログ

次の記事