Rails를 통한 발언 및 분류 링크

8448 단어 RubyRails

개시하다


Ruby on Rails에서 발언(Post) 및 카테고리(Category) 링크를 설치합니다.
모델과 컨트롤러를 생산하지 않습니다.사전에 양해해 주십시오.
운영 환경
- Ruby 2.5.1
- Rails 5.2.3

그림 완성


1. 복선상자에서 발언과 관련된 여러 종류를 선택할 수 있다.

2. 발언 버튼을 클릭한 후 DB로 등록 및 페이지 마이그레이션을 수행합니다.

다대다연관

Post는 여러 개Category와 관련이 있고, Category도 여러 개Post와 관련이 있다.이것은 다대다의 관계라고 한다.
다대다의 관계는 중간표를 통해 실현된다.

중간Post_category_relations은 중간 탁자입니다.관련 모델의post_idcategory_id.

모델


먼저 가운데 탁자의 모형부터 시작한다.PostCategorybelongs_to과 관련이 있다.
app/models/post_category_relation.rb
class PostCategoryRelation < ApplicationRecord
  belongs_to :post
  belongs_to :category
end
다음은 PostCategory의 모형이다.
중간 표의 모델post_category_relationshas_many과 관련이 있다.
app/models/post.rb
class Post < ApplicationRecord
  has_many :post_category_relations
  has_many :categories, through: :post_category_relations
end
app/models/category.rb
class Category < ApplicationRecord
  has_many :post_category_relations
  has_many :posts, through: :post_category_relations
end
또한PostCategoryCategoryPost과 관련된다.
이곳의 중점은 has_many이다.
중간표through: :post_category_relations를 통해 연관된다는 뜻이다.
또한 post_category_relations에 대한 관련은 중간표를 먼저 기술하지 않으면 has_many 오류가 발생할 수 있으니 주의하십시오.


이것은 등록 투고의 화면이다.
상기 다대다 관련에 따라ActiveRecord::HasManyThroughOrderError 대상에 post 속성이 추가되었다.
app/views/posts/new.html.erb
<%= form_with model: @post do |f| %>
  <p>
    <%= f.label :title, '題目' %>
    <%= f.text_field :title %>
  </p>

  <p>
    <%= f.label :body, '本文'%>
    <%= f.text_field :body %>
  </p>

  <p>
    <%= f.label :category, 'カテゴリ' %>
    <%= f.collection_check_boxes(:category_ids, Category.all, :id, :name) do |category| %> 
      <%= category.label do %>
        <%= category.check_box %>
        <%= category.text %>
      <% end %>
    <% end %>
  </p>

  <%= f.submit '投稿する' %>
<% end %>
category_ids 방법으로 복선상자를 만들어서 기존 클래스의 수량만 만들 수 있습니다.매개변수의 내용은 다음과 같습니다.
  • 첫 번째 매개 변수collection_check_boxes:category_ids 대상의 속성 명칭
  • 두 번째 매개 변수postCategory.all 대상의 배열 획득
  • 제3인자category 복선상자의value 속성의 값
  • 네 번째 매개 변수:id 복선상자의 탭 이름
  • 컨트롤러


    이번에 등록 투고하면 그 투고의 상세한 페이지로 옮길 것이다.
    투고와 관련된 종류는 등록 발언할 때의 매개 변수에 포함되어 있기 때문에strongparameters를 사용합니다.
    app/controller/posts_controller.rb
    class PostsController < ApplicationController
      def new
        @post = Post.new
      end
    
      def create
        @post = Post.create(post_params)
        redirect_to @post
      end
    
      def show
        @post = Post.find(params[:id])
      end
    
      private
    
      def post_params
        params.require(:post).permit(:title, :body, category_ids: [])
      end
    end
    
    요점은 :name 방법의 post_params이다.
    발언과 관련된 분류는 복선상자를 통해 여러 개를 전달하기 때문에 배열 형식으로 기록된다.

    기타


    샘플로 먼저 컨트롤러에서 분류 이름을 로그인합니다.category_ids: [] 콘솔을 시작하고 다음 코드를 입력합니다.
    %W[Ruby Java Python Go].each { |sample| Category.create(name: sample) }
    
    등록 발언 후 이전된view 파일(발언의 상세한 페이지)은 다음과 같은 내용을 사용합니다.
    app/views/posts/show.html.erb
    <p><%= "【題目】#{@post.title}" %></p>
    <p><%= "【本文】#{@post.body}" %></p>
    <span>【カテゴリ】</span>
    <% @post.categories.each do |category| %>
      <%= category.name %>
    <% end %>
    
    경로는 다음과 같습니다.
    config/routes.rb 
    Rails.application.routes.draw do
      resources :posts, only: [:show, :new, :create]
    end
    

    끝맺다

    $ rails c 서버가 시작되면 방문$ rails s에 발언 등록 화면이 표시됩니다.
    완성된 이미지에 따라 투고와 분류를 연결해서 로그인할 수 있습니다👏

    좋은 웹페이지 즐겨찾기