Rails CRUD Advanced
- Routes
To create CRUD routes, use resources
Rails.application.routes.draw do
resources :flats
end
Rails.application.routes.draw do
resources :flats, only: [:new, :create]
end
- Routes - Nested
If retaurnt « reveiws?
Rails.application.routes.draw do
resources :restaurants do
resources :reviews, only: [:index, :new, :create] # should be related to restaurant ID
end
resources: reviews, only: [:show, :create, :update, :destroy] # after having own review ID
end
- Model
1) Terminal
rails g model Restaurant name rating:integer # default is string
rails g model Review name rating:integer # default is string
2) Model
Should put has_many to Mother Model
class Restaurant < ApplicationRecord
has_many :reviews, :dependent => :destroy
validates :name, presence: true
validates :address, presence: true
validates :category, presence: true, inclusion: { in: ["chinese", "italian", "japanese", "french", "belgian"] }
end
class Review < ApplicationRecord
belongs_to :restaurant
validates :content, presence: true
validates :rating, numericality: true, inclusion: { in: 0..5 }
end
- Add more routes with ID = member
Rails.application.routes.draw do
resources :restaurants do
member do # member => restaurant id in URL
get 'chef' # RestaurantsController#chef
end
end
end
- Add more routes without ID = collection
Rails.application.routes.draw do
resources :restaurants do
collection do # collection => no restaurant id in URL
get 'top' # RestaurantsController#top
end
end
end
- Simple_form in View
Need to put gem 'simple_form'
in gemfile first
<%= simple_form_for [@restaurant] do |f| %>
<%= f.input :name %>
<%= f.input :address %>
<%= f.input :phone_number %>
<%= f.input :category %>
<%= f.submit "add to list", class: "btn btn-primary" %>
<% end %>
- Nesting_simple_form in View
Case of create/destroy/edit/new (restaurants/12/reviews)
def create
@restaurant = Restaurant.find(params[:restaurant_id])
@review = Review.new(review_params)
@review.restaurant = @restaurant
if @review.save
redirect_to restaurant_path(@restaurant)
else
render :new
end
end
<%= simple_form_for ([@restaurant, @review]) do |f| %>
<%= f.input :content %>
<%= f.input :rating %>
<%= f.submit "add review", class: "btn btn-primary" %>
<% end %>