ruby on rails 基礎1

2022. 4. 13. 19:46study

rails g controller home # home 名前のcontrollerを作る。としたら

mvcパターン

 

@time  インスタンス変数

 

viewを通じて生成された htmlが application.html.erb のyieldに変更

 

erb(Embeded Ruby ) : htmlファイルにRubyを組み込むことができるようにする。

<% @wonno = "원노" %>その値を定義すること(wonnoに"원노"を入れる.)

<%= @wonno %>画面に表示するコード

作成していない基本ベースコード(title、<html>、<metatag>)はapp/views/layouts/application.html.erb
他の基本js cssなどはapp/assets/stylesheetsに位置
jscss のコードはapplication.html.erb から受ける。
index.html.erb内容は application.html.erb

 

サーバーにデータを送信する方法

1.データ、クエリストリング方式
:params というメソッドを使わなければならない。
使用する場合
aタグを使用してクエリストリングを送信する場合。
: pagenation、order、フィルターのように開発者が決めておいたデータを渡さなければならない時、それで決めておいた機能を動作させなければならない時

 

class HomeController < ApplicationController
	def index
    	params[:dev]
        @time = Time.current
    end
end

devのデータdevの中のデータであるwonnoを開いてみることができる。
viewで呼び出したいなら、

class HomeController < ApplicationController
	def index
    	@dev = params[:dev]
        @time = Time.current
    end
end

@devに入れて
index.html.erb も呼び出すことができる。


2。 post方式を利用すればデータがアドレスバーに隠されて伝送をすることが可能になる。
使用する場合

1.保存するデータを送信するとき
2.セキュリティが必要なデータを送信するとき

<form action="/sum" method="post">
	<input type="text" name="first">
	<input type="text" name="second">
	<button type="submit">제출</button>
</form>

3. . pathパラメータ
:pageはpathパラメータを使ったほうがよい。

#routes.rb

get "home/:id" => "home#show"
get "home/:id" => "home#show" 
#idの前に : を付けることでpathパラメータを書くということになる、idを要請するとhomeのshowに行く。

管理者ページを簡単に作成

 

gemfileに見て

gem 'devise'
gem 'activeadmin'

このように入力した後

 

bundle install
rails g active_admin:install
 rake db:migrate #db하위에 있는 migrate에 있는 파일을 실행.
 rake db:seed #seeds.rb를 실행시켜주는것
 #scatffold 명령어는 모델을 만들면서 그 모델을 위한 curd 페이지도 같이 자동으로 만들어주는 명령어
 rails g scaffold User name email #유저 만들기
 rails g scaffold Post user:references title content:text published_at:datetime //post 만들기
 rails g active_admin:resource User # 사용자를 위한 admin 페이지 생성
 rails g active_admin:resource Post #post를 위한 admin 페이지 생성

管理者ページで新しく作った領域ではアクセス制限を解除しなければならない。
//管理者ページごとに修正するカラムをここに定義せよ

ActiveAdmin.register User do
  permit_params :user_id, :title, :content, :published_at

+ 該当コラムリストはSchema.rbで確認可能。


scaffold

簡単なCRUDページを作成できるようにサポート。

 

#커맨드
rails g scaffold Post title:string content:text
rake db:migrate

#그 후 config/routes.rb 에서
root "posts#index"추가

1.RESTful:住所だけして、どんな規則(意味)を持っているのか分かるようにすること。
アドレス設定をRESTするのがいい。
RESTfulの作成方法

RESTfulの読み方
: 要請(htpメソッドと住所)の中には主語(url)と動詞(htpメソッド部分)があるのでそのまま読めば良い。

ex)主語部分:/post/new #postデータのnewするためのページ
動詞部分:GET POST DELETE PUT PATCH

位置:config/routes.rb의 resources :posts
開発者が住所確認RESTしたurlという意味。
resources:posts - crudするためのアドレスを自動的に作成する。

 

https://meetup.toast.com/posts/92

 

REST API 제대로 알고 사용하기 : NHN Cloud Meetup

REST API 제대로 알고 사용하기

meetup.toast.com

DRY重複除去
render:viewで重複するコードがある場合、再利用するために使う。

https://kbs4674.tistory.com/24

rails each文

 

 

4-4. Colllection Document

 

CollectionとDocumentについて知ると、URI設計が一層容易になります。 DOCUMENTは単純に文書として理解してもいいし、一つのオブジェクトだと理解してもいいと思います。 コレクションは文書の集合、オブジェクトの集合だと思っていただければ、理解するのにより楽だと思います。 コレクションとドキュメントはすべてリソースと表現でき、URIに表現されます。 例を見てみましょう。

    http:// restapi.example.com/sports/soccer

上記のURIを見ると、sportsというコレクションとsoccerというドキュメントで表現されていると考えてください。 もう少し例を挙げてみると

 

    http:// restapi.example.com/sports/soccer/players/13


sports、playersコレクションとsoccer、13(13番の選手)を意味するドキュメントとしてURIが行われます。 ここで重要なことは、コレクションは複数で使用していることです。 より直観的なRESTAPIのためには、コレクションとドキュメントを使用する際に、単数複数のもの守ってくれれば、より理解しやすいURIを設計することができます。

 


重複除去dry

app/views/posts/new.html.erbrenderというコードがある@postは@post=Post.newという意味
app/views/posts/edit.html.erbrender formというコードがある。 @post는 @post = Post.find params[:id]

renderはview繰り返されるタグがある場合に使用。この場合はform
partialで彫刻テンプレートに分けた後、renderを通じて呼び出す方式で具現される。
方法:ファイル名の前に_を貼ればいい。
renderに読み込むときは、_を抜いて読み込む。

before_actionにはファイル名が入るメソッドはアクションにしてはいけない

class PostsController < ApplicationController
  before_action :set_post, only:[:show,:edit, :update, :destory]

patial : 彫刻テンプレート
にして呼び寄せるやり方
ファイル名の前に_を付けると、ピーステンプレートを注文する。

読み込むときは、_を抜いて作成および読み込む。

before_action:コントローラから重複を除去するコード
posts_controllerにある

一般メソッド(ビューと繋がらず機能のみのメソッド)はprivate(or protected)にして作成しなければならない。
(機能のみの一般メソッドで生成される。 )
+

renderはビューから重複除去
before_actionはコントローラから重複除去


 

CSRFトークン処理 :formを通じてデータを保存·修正する目的で送信する際、特定のトークンも一緒に送信すること#必須

ストロングパラメータ :
app/controllers/posts_controller.rb 에서 post_params
ホワイトリスト処理した。 (コントローラからユーザが修正できるカラムを指定するセキュリティ形式)

#メソッドにあらかじめ登録・更新を許可するカラム名を指定(ホワイトリスト形式)

def post_params
	params.require(:post).permit(title:, :content)
end

 postモデルでユーザーが修正できるカラムはtitle、contentのみである。

上記の2つはビューヘルパー、form_withとつながっている。
ビューヘルパー:レールズコードで、html要素を作ってくれるメソッド、renderやlink_to
: 使う理由はRESTful、重複除去、セキュリティ処理を自動的に見えないように処理するため。

 

app/views/posts/new.html.erb

 

scaffoldはさらに2つのビューヘルパーを使用
link_to  : a リンクタグのビューヘルパー

<%= link_to 'back', posts_path %>

<a href="<%= posts_path %>">Back</a>

解析:backはaタグに包まれた要素、posts_pathはクリックすると移動するアドレス。
レールズは、ルートで生成したアドレスをメソッド化するが、=route helper

form_with
2つ。
1. モデルに関連しているフォーム(修正または保存するためのフォーム)
2. そうでないフォーム(単純検索用フォーム)
1.の場合にはaction method の場合には必要ない。(自動的に処理、RESTであるという仮定の下)

 

RESTfulはレールズコードの必須部分


XY프라블럼

 


 

rails g controller home index

: homeコントローラを作成し、indexを作成します。

rails g controller packs index show

: packsコントローラを作成し、indexページがパックにすべてを表示するページ、showが詳細ページ

 root 'home#index' 

ホームページは一般的に最も重要なパスであり、パスは表示される順に優先順位が指定されるため、rootパスは一般的にパスファイルの最初のパスである必要があります。

デバッグ時の重要順序

ㅇㅇ

上の写真の説明
どのような方式か(ex GET方式か)、routes情報
処理中のコントロールラーとは何か(ex Home Controller#index)
出力されているview
コントロールラーと接続されたview

エラーを強制的に発生させる
特定のコントロールラーのdefの内容を注釈処理させるとエラー発生確認。

バグコードテストをするとき
1.仮想の実験所の作り方

 

rails console

エラー箇所のコードを入力

 

exitって打てば脱出。

2. byebug (実際にエラーが出る上項でconsoleをつけよう。)

 

<% byebug %> 

 

このコードを書いた部分で止まる
それでconsoleでその後にコードを入力してみることが可能。 この方法でerrorテスト可能。
c押されれば脱出可能。

 

root #

get /

더보기

error & 解決方法

bin/rake db:migrate RAILS_ENV=development

bin/run db:migrate RAILS_ENV=development

このエラーが発生し続ける場合は、プロンプトを介してコマンドを実行します。
移行が保留中です。 この問題を解決するには、次のことを実行してください。 bin/rake db:migrate RAILS_ENV=development

 


# ActiveAdmin 
gem 'activeadmin' # Plus integrations with: 
gem 'devise' 
gem 'cancancan' 
gem 'draper' 
gem 'pundit'

출처: https://hwangwoojindev.tistory.com/4 [hwangwoojin.dev]

 

Ruby on Railsでログイン機能を具現してくれるgemがある。
まさにDevise!存在自体がありがたい。

Deviseの使用方法
まず、コントローラーが 1 つでもあると仮定する。
なければ、rails g controller home indexでhome controllerを設定する。

Gemfileにdeviseを追加してくれる。
Active Adminはルビオンレールズの管理者ページを作成するプラグインです。

 

Ruby on Railsでログイン機能を具現してくれるgemがある。
まさにDevise!存在自体がありがたい。

Deviseの使用方法
まず、コントローラーが 1 つでもあると仮定する。
なければ、rails g controller home indexでhome controllerを設定する。

Gemfileにdeviseを追加してくれる。
Active Adminはルビオンレールズの管理者ページを作成するプラグインです。

application.rb

 *= stub active_admin 
 
추가
 
application.js
 
//
잡다한 꿀팁
.erb가 붙어씩 때문에 ruby의 @변수를 포함하는 능력을 가질 수 있다.
(Embedded Ruby)
<form action="URL">
: <form>タグのactionプロパティは、フォームデータ(form data)をサーバに送信する際に、そのデータが到着するURLを明示します。(そして移動)
すべてのページ間の移動はRoutes.rbに記録
 

클론코딩 시작

rails g model Pack image:string product_name company_name desc:text

rake db:migrate

rails g controller home index

#インデックスページがパックの全リストを示すページ。 ショーページは、そのパックの詳細情報を表示できるページ。

rails g controller packs index show

 

bundle install

rails g active_admin:install

rake db:migrate 

rake db:seed

 

rails g active_admin:resource Pack

 

이미지 및 파일 업로드 하는 기능 추가.

 

rails active_storage:install

 

app/models/pack.rb

 

#packs.rb

ActiveAdmin.register Pack do
 # new, edit 커스텀 부분
 form do |f|
  f.inputs do
   f.input :image, as: :file
   f.input :product_name
   f.input :company_name
   f.input :desc
  end
  f.actions
 end
end

#as: :file 이 파일업로드 할수 있는 거.

# show 수정하는 방법
 show do
  attributes_table do
   row :id
   row :image do |pack|
    if pack.image.attached?
     image_tag url_for(pack.image), class: "small_img"
    else
     "이미지 없음"
    end
   end
   row :product_name
   row :company_name
   row :desc
  end
 end
end

 

한국어패치

config/locales/ko.yml 생성

config/locales/active_admin.ko.yml생성

 

rails i18n ko라고 검색해서 기본 설정 코드 찾기.

https://github.com/svenfuchs/rails-i18n/blob/master/rails/locale/ko.yml

 

GitHub - svenfuchs/rails-i18n: Repository for collecting Locale data for Ruby on Rails I18n as well as other interesting, Rails

Repository for collecting Locale data for Ruby on Rails I18n as well as other interesting, Rails related I18n stuff - GitHub - svenfuchs/rails-i18n: Repository for collecting Locale data for Ruby o...

github.com

rails activeadmin

 


bootstrap ブートストラップ
Gemfileにbootstrapを挿入。
carousel:イメージスライド

 


初期devise設定

1.Gemfileにgem "devise"を追加
2. rails g devise install

enum:特定保存できる値を自分が望む値に指定すること

+雲ideでmysqlを使用する、外部接続権限付与

+https://dalconbox.com/37

 

구름IDE 에서 MySQL 사용하기

구름 IDE에서 컨테이너를 생성 합니다. 맨 아래에서 MySQL설치를 체크한 후 설치하면 됩니다. 소프트웨어 스택은 Node.js를 사용했습니다. 그리고 더 편리하게 사용하기 위해 HeidiSQL을 설치해 줍니다

dalconbox.com

+localhost:3000/rails/info/routes : 에서 controller action에서 원하는 파일의 경로 확인 가능.    

 

selectOptionの作成。
statusの場合は追加コードが必要
model値を読み込む

<div class="field>
	<%= f.label :status %><br />
    <%= f.select :status, User.statuses.keys %>
</div>

 

devise controllerは基本的に設定された設定であるため、別に設定されているわけではないので、修正したい場合は新たに作らなければならない。

paramsはRailsで送られてきた値を受け取るためのメソッドです。
params[:列の名前]
requireとは必要とするで、permitは許可をするという意味です。

 

rails g active_admin:resource User

app/admin/users.rb : 생성 

actvie admin 설정하는 코드가 있는 사이트.

https://activeadmin.info/documentation.html

 

Active Admin | The administration framework for Ruby on Rails

Active Admin is a framework for creating administration style interfaces. It abstracts common business application patterns to make it simple for developers to implement beautiful and elegant interfaces with very little effort. Getting Started Active Admin

activeadmin.info

 

app/assets/stylesheets/application.css

: 일반페이지랑 관리자 페이지랑 안 섞이게 함.

*= stub active_admin

特定の基準を持って検索する。 

scope : all, default: true
scope :no_status

html.erb 修正すれば controller 修正しても問題なし
indexは消してあげた方が安全だ。
enum : _suffix: true :

ターミナルにrailsc を入力すると、該当メソッドおよびオブジェクトが何を意味するかが分かる。
ex) rails c
User.regions

schema.rbでdb生成下の接続部位を確認可能。

コード通りに進まない場合は、サーバーをオフにして再起動する。
保存及び変更ができない場合は、ストロングパラメータを確認する。(ビューから変えてもホワイトリストから変えると意味x)
(application_controller.rbで切り替える。)

validation
:正しいデータが入るように検証すること。

ex)1

class User < ApplicationRecord
	devise :database_authenticatable, :registerable
    	   :recoverable, :rememberable, :validatable
    validates :phone, length: { is: 11 }, allow_nil: true
    validates :post_code, length: { is: 5 }, allow_nil: true
end

ex)2

class Pack < ApplicationRecord
  has_one_attached :imgae
  
  validates :product_name, :company_name, :price, presence: true
  validates :is_publish, exclustion: ( in: |nil| )
end

 

app>admin>packs.rb

#new, edit 커스텀 부문
form do |f|
  f.inputs do
  	f.input :imgae, as: :file
  	f.input :product_name
  	f.input :company_name
  	f.input :desc
  	f.input :price, hint: "실제 판매 가격"
  	f.input :is_publish
  end
  f.actions
end

 


scope

-admin part

 

app/models/pack.rb

でscope生成可能。
当該範囲指定を行う際に利用.

 

한글화 : 

-> {"공개"}

app/admin/packs.rb

ex) 

scope :all
scope :{"공개"}, :published, default :true
scope :{"비공개"}, :unpublished

adminバッチアクション


画面の戻り
redirect_back
変更確認メッセージ
flash[:notice] = "伝えたいメッセージ"

batch_action :publish as |ids|
  @packs = Pack.where(id: ids)
  
  @packs.each do |pack|
    pack.update(is_publish: true)
  end
  flash[:notice] = "마스크팩이 공개 되었습니다."
  redirect_back(fallback_location: root_path)
end

 


-custom part

 

packs_controller.rb index 修正

 

def index
  @packs = Pack.published
end

 

+더미 데이터 추가하는 방법.

app>models>pack.rb

def self.set_dummy_datas
  20.times do
    Pack.create(
    #필수 입력값
      product_name: "hii"
      company_name: "dd"
      price: 1000
    )
  end    
end

실행코드 :  Pack.set_dummy_datas

삭제코드 : Pack.destroy_all

 

+

gem 'faker', :git => 'https://github.com/faker-ruby/faker.git', :branch => 'master' 

추가

https://github.com/faker-ruby/faker

app/views/packs/index.html.erb

<div class="container">
  <div class="row">
    <% @packs.each do |pack| %>
      <div class="col-4 mt-4">
        <div class="card" style="width: 18rem;">
          <% if pack.image.attached? %>
            <img src="<%= url_for(pack.image) %>" class="card-img-top" alt="...">
          <% end %>
          <div class="card-body">
            <h5 class="card-title"><%= pack.product_name %></h5>
            <p class="card-text"><%= pack.desc %></p>
            <a href="/packs/show/<%= pack.id %>" class="btn btn-primary">이동</a>
          </div>
        </div>
      </div>
    <% end %>
  </div>
</div>

 

 

 


 

 

form+https://wantknow.tistory.com/55

index , route, controller, もらえる方.erb 修正 

 

GET&POST+https://wantknow.tistory.com/58

HTTPメソッド(get、postなど):クライアントとサーバの間で行われるリクエスト(Request)と応答(Response)データを送信する方式

 

+기능적

  • GETはアドレスバーに?の後ろにname=値の形で続きます。 ex) write?title=こんにちは&content=お会いできて嬉しいです
  • POSTはアドレスバーに表示されず、隠されて送信されます。

  • GETはアドレスバーにつなぎ合わせるため、長さ制限があります。
  • POSTはGETより多くの量を送ることができます。

  • GET はそのURL のページが存在する。
  • POST URL はメソッドそのものであり、ページが存在しない

意味的

  • GETは持ってくるもの(read)情報照会

POSTは行うもの(create)新しい情報登録+params
paramsは要請を受ける役割をします。 つまり、リクエスト情報抽出の役割です!(リクエストを入れるかご。)

https://wantknow.tistory.com/59

 

[before model 4] rails & params

모델 배우기 전에 [before model 1] rails & form에 대하여 [before model 2] rails & route 1 [before model 3] get or post?? Http 메소드란? params란 이번에는 rails 모델 배우기 전에 마지막 부분 parmas입..

wantknow.tistory.com

 

     

Paths Matching

/admin/users/:user_id/carts(.:format)

 

+pry-railsを追加すると、rails cのようにデバッグする時に可視的によく見える。
出たい時はQ 完全に出る時はexit

 


 

app>views/packs/show.html.erb

<script>
	<% if flash[:notice].present? %>
    result = confirm("<%= flash[:notice] %>")
    
    if[result]{
    location.href = "/carts"
    }
    <% end %>
</script>

買い物かごの中に既存の物があるか確認していると合わせるロジック

 

def create
  cart = Cart.new(
    pack_id: params[:pack_id],
    user_id: current_user.id,
    quantity: params[:quantity]
  )
  
  sample_carts = current_user.carts
  
  # 기존에 내가 똑같은 팩을 등록했는지 찾기
  remain_cart = sample_carts.find_by(pack_id: params[:pack_id])
  
  if remain_cart.present?
    sum_quantity = remain_cart.quantity + params[:quantity].to_i
    
    remain_cart.update(quantity: sum_quantity)
  else
    cart.save
  end
  
  flash[:notice] = "장바구니"
  
  redirect_back(fallback_location: root_path)
end

 

 

dependent::destroyを追加すると、
親モデルを削除する際に親モデルを束ねる"子モデル"も一緒に削除できます。

ex)

has_many :order_items, dependent: :destroy

 

 

+1

method="POST"を書く場合は、
hidden field codeを書かなくてはならない。

+2

 

例えば

<form action="/orders" method="POST"
	<%= hidden_field_tag :authenticity_token, form_authenticity_token %>
    <% @carts.each do |cart| %>
    <input type="text" name="cart_id[]" value="<%= cart.id %>"> #name 뒤에 []만 붙여주어도 배열(여러개 넘기는 게) value="1", value="2" 의 형식으로 가능.
</form>

(ロジック)買い物かご機能での決済を行う際には、
cart内にはすでに製品名と製品名に価格をcartidから持ってくればいい。

価格単位設定document

https://railsdoc.com/page/number_to_currency

 

order_ controller

 

def create
	order = Order.create(user_id: current_user.id)
    
    carts = Cart.where(id: params[:cart_id])
end

 show.html.erb

<div class="container">
 <div class="row">
  <div class="col-12 mt-4">
   <h3> 주문 정보 확인</h3>
   <% @order.order_items.each do |item| %>
    <div class="card mt-3">
     <div class="card-body">
      <h5 class="card-title"><%= item.pack.product_name %></h5>
      <h6 class="card-subtitle mb-2 text-muted"><%= item.pack.company_name %></h6>
      <p class="card-text">수량<%= item.quantity %></p>
      <a herf="#" class="card-link>수정</a>
      <a herf="#" class="card-link>삭제</a>
      <p class="card-text">가격<%= number_to_currenty(item.quantity = item.pack.price) %></p>
     </div>
    </div>
   <% end %>
  </div>
 </div>
</div>

現在、買い物かごの品物がある時だけ見えるようにする。

 

index.html.erb

<% if @parts.present> %
	#여기에 값 장바구니 물건 리스트 집어넣기.
<%end%>

  

'study' 카테고리의 다른 글

git  (0) 2022.05.11
Linux command Line  (0) 2022.05.11
RUBY 基礎  (0) 2022.04.09
jQuery 基礎  (0) 2022.03.28
Javascript 基礎(概念整理)  (0) 2022.03.25