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を参照していただけると幸いです。(記事にするとめっちゃ長くなってしまうため。。。↓今回時点のコミットログ
次の記事