개인 앱 개발 일기 #5

게시하거나 게시 세부 정보 표시, 삭제, 목록 표시를 구현합니다.



우선, 무엇이든
rails g controller drinks
rails g model Drink

실행

커피의 감상을 투고하는 앱이므로, 모델명이나, 컨트롤러명을 coffee로 하고 싶었습니다만,
coffee는 불가산 명사이므로, 가능한 한 피하는 것이 현명.
라고 하는 일로 drink라고 명명했습니다,,,! !

이미지도 게시하고 싶기 때문에
% brew install imagemagick

터미널에서 실행
gem 'mini_magick'
gem 'image_processing', '~> 1.2'

라는 gem을 install
bundle install

drinks_controller


class DrinksController < ApplicationController
  include SessionsHelper
  before_action :logged_in_user, only: [:index,:destroy]
  def index
    @drinks = Drink.includes(:user).order("created_at DESC")
  end

  def show
    @drink = Drink.find(params[:id])
    @user = @drink.user
    @drinks = @user.drinks
  end

  def new
    @drink = Drink.new
  end

  def create
    @drink = current_user.drinks.build(drink_params)
    if @drink.save
      redirect_to drinks_path
    else
      redirect_to 'new'
    end
  end

  def destroy
    Drink.find(params[:id]).destroy
    redirect_to root_path
  end

  private
  def drink_params
    params.require(:drink).permit(:name,:price,:explain,:image).merge(user_id: current_user.id)
  end
end


  def index
    @drinks = Drink.includes(:user).order("created_at DESC")
  end



목록 화면에 표시하는 게시물의 정보에는 사용자 정보도 붙어 표시됩니다.
이 경우 게시물에 연결되는 사용자 정보를 얻으려면 게시물 수와 동일한 횟수의 액세스가 필요하므로 N + 1 문제가 발생합니다.

요점은 게시물에 묶어 사용자의 정보를 일거에 취득하기 때문에 빨라지는 것입니다
  def create
    @drink = current_user.drinks.build(drink_params)

user.rb와 연관하여 .build라는 메소드를 사용할 수 있습니다.
이 방법을 사용하면 마음대로 user와 능숙한 느낌에 연결한 게시가 가능합니다

drink.rb


class Drink < ApplicationRecord
  belongs_to :user
  has_one_attached :image
  with_options presence: true do
    validates :name
    validates :explain
  end
end

with_option 메소드는 함께 검증을 설정할 수 있는 메소드입니다.
존재성뿐만 아니라 형식 검증에도 사용할 수있어 편리하므로 꼭 조사하여 사용해보십시오.

우선은 커피에 관한 투고를 해 가고 싶습니다!



투고하는 내용은 커피의 이름, 이미지, 가격, 설명입니다.

drinks/new.html.erb


<%= form_with model: @drink,local: true do |f| %>
  <%= render 'shared/error_messages', object: f.object %>
      <%= f.text_field :name, placeholder: "商品名" %>
      <%= f.text_field :price, placeholder: "値段" %>
      <%= f.text_area :explain, placeholder: "商品の説明", rows: "10" %>
      <h3>コーヒーの写真を投稿してください</h3>
      <%= f.label :image %>
      <%= f.file_field :image %>
      <%= f.submit "SEND" %>
<% end %>



보기로 하면 이런 느낌

뭔가 올리자.

drinks/index.html.erb


<% @drinks.each do |drink| %>
  <%= drink.name %>
  <%= image_tag drink.image.variant(resize: '500x250') if drink.image.attached? %>
  <%= drink.price %>
  <%= drink.explain %>
  <%= link_to drink.user.nickname ,drink_path(drink) %>
<% end %>
<%= link_to "投稿する", new_drink_path %>
<%= link_to "トップページ", root_path %>

게시 후 drinks#index를 호출합니다.



레이아웃 무너지는 것입니다만 확실히 화상 첨부로 표시되고 있어 안심했습니다

다음은 투고 상세를 보자.

drinks/show.html.erb


<%= @drink.user.nickname%>
  <% @drinks.each do |drink| %>
      <%= drink.price%>
      <span class="name"><%= drink.name %></span>
      <p><%= drink.explain %></p>
      <%= image_tag drink.image.variant(resize: '500x250') if drink.image.attached? %>
      <%= link_to "削除",drink_path(drink.id),method: :delete %>
  <% end %>



지금은 투고의 상세 페이지를 누른 곳에서 살 풍경입니다만, 여기에 이 ​​투고가 붙은 코멘트가 달라라고 표시되는 느낌으로 하고 싶네요,,,! !

삭제는 괜찮을 것입니다,,,,

대충 기본적인 기능은 할 수 있었으므로 다음 번에는 외형을 엄청 잘 해 나가고 싶습니다,,,! ! !

좋은 웹페이지 즐겨찾기