TECH EXPERT 10日目

TECH::EXPERT

自分用のサイトを作ることにしてコツコツやっているが進まない。
railsの理解が浅いのと、そもそも使い方がよくわかってないので戸惑うばかり。
resourceを使ったルーティングで自動的に名称変更されたり、rails独自の機能が邪魔ばかりする。
A→Bという処理のつもりでもA→Bsとかされるので困っちゃう。
railsは内部で勝手な動作をする(してくれる)ので理解には向いてないな。
というか最初に学んではダメな言語なんじゃなかろうか?

明日からは理解は一旦置いておいて、生産性を上げるための覚えゲーとしてやってみることにしよう。

やったことメモ

validation(検証)

入力フォームを通じてビューからサーバー側へパラメーターが送られてきた際、正常な値か検証する。未入力を撥ねるために使う。

 validates :カラム名, presence: true

フォームの中身の有無を検出してくれる。ない場合には保存処理をしない。

例えば、userのemailを入力必須にしたい場合、以下のように書く。
user.rb

class User < ApplicationRecord
 validates :email, presence: true 

ユーザーの新規登録時にemailを入力しなかった場合、userを登録することができなくなる。

redirect_toメソッド

redirect_to controller: :コントローラー名, action: :アクション名
例
redirect_to controller: :products, action: :index

フォームから値の受け渡しと統合

params.permit(:image, :text).merge(user_id: current_user.id)

resourcesとresource

単数形と複数形で挙動が異なる。
複数形だとindexとcreate以外のアクションに:idが付与される。
そして単数形を用いる場合、リソースが1つと判断でき、indexする必要がないため自動的にindexアクションは省かれる。

単純なページ等でresourceと単数形で用いたい場合、resourace :bookのようにどちらもたんん数形で指定しても返されるコントローラー名(controllers#show)などは複数形が指定される。railsのルールとしてコントローラー名は複数形で使われるから。
ただし、resources bookとした場合にはbook#indexという風にそのまま作成される。

処理としてはresourceに与えられる値は複数形化され、resourcesはもともと複数形として信頼されているのでそのままでコントローラー名として扱われる?
resource 単数形 複数形化#アクション  => 明らかな介入あり
resource 複数形 そのまま#アクション  => 介入あるか不明
resources 単数形 そのまま#アクション  => 介入なし
resources 複数形 そのまま#アクション  => 介入あるか不明

resources :tweets

tweets      GET    /tweets(.:format)         tweets#index
            POST   /tweets(.:format)         tweets#create
new_tweet   GET    /tweets/new(.:format)     tweets#new
edit_tweet  GET    /tweets/:id/edit(.:format)tweets#edit
tweet       GET    /tweets/:id(.:format)     tweets#show
            PATCH  /tweets/:id(.:format)     tweets#update
            PUT    /tweets/:id(.:format)     tweets#update
            DELETE /tweets/:id(.:format)     tweets#destroy
resourece :tweets

new_tweets GET    /tweets/new(.:format)   tweets#new
edit_tweetsGET    /tweets/edit(.:format)  tweets#edit
    tweets GET    /tweets(.:format)       tweets#show
           PATCH  /tweets(.:format)       tweets#update
           PUT    /tweets(.:format)       tweets#update
           DELETE /tweets(.:format)       tweets#destroy
           POST   /tweets(.:format)       tweets#create

実際に使う際にはこのようにネストしたり、onlyで使うやつだけ指定する。

Rails.application.routes.draw do
  devise_for :users
  root to: "tweets#index"
  resources :tweets, only: [:index, :show, :new, :destroy, :edit, :update, :create] do
    resources :comments, only: [:create]
  end
  resources :users, only: [:show]
end

prefix

prefix + “_path”で相対パスを指摘できる。
上記の例でtweet_pathとすると/tweet/:id
引数にインスタンスを指定すれば:idが埋まる。
@tweet = Tweet.find(params[:id]) などとして
tweet_path(@tweet)のようにするとパスが埋まる。

リレーションのCreate

current_user.reviews.create(create_params)とするとcurrent_userの入ったテーブルが作成される。その他の情報はparamsから。

def create
  current_user.reviews.create(create_params)
  redirect_to controller: :products, action: :index
end

private
  def create_params
    params.require(:review).permit(:rate, :review).merge(product_id: params[:product_id])
  end

css

list-style: none;

ul unordered list

railsに対する理解、流れ

モデル作成>ルーティング(resource)>

  def create
    comment = Comment.create(text: comment_params[:text], tweet_id: comment_params[:tweet_id], user_id: current_user.id)
    redirect_to "/tweets/#{comment.tweet.id}"   #コメントと結びつくツイートの詳細画面に遷移する
  end

vivaldhiでスーパーリロードが効かない

command + F5でボイスオーバーが起動するのでまずはMacのキーボードショートカット をOFF.
デフォルトでshift + command + Rとcommand + F5があるが、この状態でもなぜかcommand+f5が効かない。

deviseインストール後つづき

テーブルに必要な入力項目を足す。

rails g migration AddNameToUser name:string
bundle exec rake db:migrate

routesを通す。

TechReviewSite::Application.routes.draw do

  devise_for :users
  resources :users, only: :show
  resources :products, only: :show do
    resources:reviews, only:[:new, :create]
    collection do
      get 'search'
    end
  end
  root 'products#index'
end

ログインを強制する

コントローラに以下を追記してアクションを制限する。

before_action :authenticate_user!, only: :search

deviseのストロングパラメーターを追加する

  class ApplicationController < ActionController::Base
    # Prevent CSRF attacks by raising an exception.
    # For APIs, you may want to use :null_session instead.
    protect_from_forgery with: :exception
    before_action :configure_permitted_parameters, if: :devise_controller?

    def configure_permitted_parameters
      devise_parameter_sanitizer.permit(:sign_up, keys: [:nickname])
    end
  end

renderメソッド

<div class="contents row">
  <% @tweets.each do |tweet| %>
    <%= render partial: "tweet", locals: { tweet: tweet } %>
  <% end %>
  <%= paginate(@tweets) %>
</div>

Active Storage

ユーザー登録に画像を登録させる際に使う。
登録された画像を利用する際には下記のようにする。

<%= image_tag current_user.avatar %></div>

コメント