2022. 4. 13. 19:46ㆍstudy
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パスは一般的にパスファイルの最初のパスである必要があります。
デバッグ時の重要順序

ㅇㅇ

上の写真の説明
どのような方式か(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はルビオンレールズの管理者ページを作成するプラグインです。
まさにDevise!存在自体がありがたい。
Deviseの使用方法
まず、コントローラーが 1 つでもあると仮定する。
なければ、rails g controller home indexでhome controllerを設定する。
Gemfileにdeviseを追加してくれる。
Active Adminはルビオンレールズの管理者ページを作成するプラグインです。
application.rb
すべてのページ間の移動は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を使用する、外部接続権限付与
구름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 |