自分用のサイトを作ることにしてコツコツやっているが進まない。
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>
コメント