Rails 基礎3

### relation(belongs:to)
$ rails g model Comment body:string post:references
$ rails db:migrate

model
app/models.comment.rb

class Comment < ApplicationRecord
  belongs_to :post
  validates :body, prensence: true
end

post modelにもcommentと紐づいていることを書く

class Post < ApplicationRecord
	has_many :comments
	validates :title, presence: true, length: {minimum: 3, message: 'too short to post!'}
	validates :body, presence: true
end

post.comments と書くことができる様になる

routes.rb

  resources :posts do
  	resources :comments
  end

$ rails routes
Prefix Verb URI Pattern Controller#Action
post_comments GET /posts/:post_id/comments(.:format) comments#index
POST /posts/:post_id/comments(.:format) comments#create
new_post_comment GET /posts/:post_id/comments/new(.:format) comments#new
edit_post_comment GET /posts/:post_id/comments/:id/edit(.:format) comments#edit
post_comment GET /posts/:post_id/comments/:id(.:format) comments#show
PATCH /posts/:post_id/comments/:id(.:format) comments#update
PUT /posts/:post_id/comments/:id(.:format) comments#update
DELETE /posts/:post_id/comments/:id(.:format) comments#destroy
posts GET /posts(.:format) posts#index
POST /posts(.:format) posts#create
new_post GET /posts/new(.:format) posts#new
edit_post GET /posts/:id/edit(.:format) posts#edit
post GET /posts/:id(.:format) posts#show
PATCH /posts/:id(.:format) posts#update
PUT /posts/:id(.:format) posts#update
DELETE /posts/:id(.:format) posts#destroy
root GET / posts#index

$ rails g controller Comments

show.html.erb

<h3>Comments</h3>
<%= form_for ([@post, @post.comments.build]) do |f| %>
<p>
	<%= f.text_field:body %>
</p>
<p>
	<%= f.submit %>
</p>
<% end %>

comments_controller.rb

	def create
		# render plain: params[:post].inspect
		@post = Post.find(params[:post_id])
		@post.comments.create(comment_params)
		redirect_to post_path(@post)
	end

	private
		def comment_params
			params.require(:comment).permit(:body)
		end

posts_controller.rb
L 変更なし

	def show
		@post = Post.find(params[:id])
	end

show.html.erb

<ul>
	<% @post.comments.each do |comment| %>
	<li>
		<%= comment.body %>
		<%= link_to '[x]', 
			post_comment_path(@post, comment), 
			method: :delete, 
			class: 'command',
			data: { confirm: 'Sure ?'} %>		
	</li>
	<% end %>
</ul>

controller

	def destroy
		@post = Post.find(params[:post_id])
		@comment = @post.comments.find(params[:id])
		@comment.destroy
		redirect_to post_path(@post)
	end

route

Rails.application.routes.draw do
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
  resources :posts do
  	resources :comments, only: [:create, :destroy]
  end

  root 'posts#index'
end

記事を削除した時にコメントも削除する
model

class Post < ApplicationRecord
	has_many :comments, dependent: :destroy
	validates :title, presence: true, length: {minimum: 3, message: 'too short to post!'}
	validates :body, presence: true
end

なるほど、オリジナルで作らんとダメやな