study

Ruby on rails

까꿍옹야 2022. 11. 28. 13:50

ruby

p("content")   # "content"と表示される

p(……)」は関数pの呼び出しである。任意のオブジェクトを「そ れっぽく」表示してくれる。基本的にデバッグ用の関数だ。

ハッシュテーブルとは、任意のオブジェクト同士の一対一対応を示す仕組みである。

(해시 테이블이란, 임의의 오브젝트끼리의 일대일 대응을 나타내는 구조이다. )

 

 

ここでは文字列オブジェクト(内容は「content」)に対してupcaseメソッド を呼び出している。upcaseはアルファベットの小文字を大文字にした新しい文 字列を返すメソッドなので、次のような結果になる。

p("content".upcase())   # "CONTENT"と表示される

メソッド呼び出しは連鎖してよい。

"content".upcase().downcase()

この場合、"content".upcase()の返り値のオブジェクトに対してdowncaseメソッ ドを呼ぶ、ということになる。


これは新しいクラスCの定義である。 定義すると次のように使用できる。

(이것은 새로운 클래스 C의 정의이다. 정의하면 다음과 같이 사용할 수 있다.)

class C 
end 
c = C.new() # クラス C のインスタンスを作成し変数 c に代入(클래스 C의 인스턴스를 작성해 변수 c에 대입)

インスタンスを作成する手法newCではないので注意。

(인스턴스를 작성하는 기법 new C은 아니기 때문에 주의.)

 

C.new()という技法はメソッド呼び出しのようだ、と思った読者は鋭い。 Ruby ではオブジェクトを生成する式は単純なメソッド呼び出しである。

(C.new()라는 기법은 메소드 호출 같다, 라고 생각한 독자는 날카롭다. Ruby에서는 객체를 생성하는 식은 단순한 메서드 호출이다.)

 

まずRubyにおいてクラス名とは定数名と同義である。


定義したメソッドを使ってみる。 メソッドはデフォルトで外部から呼べるようになっている。

(정의한 메소드를 사용해 본다. 메소드는 디폴트로 외부로부터 부를 수 있게 되어 있다.)

c = C.new() 
result = c.myupcase("content") 
p(result) # "CONTENT"

p(C.new().myupcase("content")) #  同じく "CONTENT"

 


(self = this(자바나  js의))

しかし自分自身のメソッドを呼ぶのに「自分の」とわざわざ指定しなければな らないのは面倒だ。それでselfに対する呼び出しのときはメソッドを呼び出す 対象のオブジェクト(レシーバreceiver)を省略できるようになっている。

 

override

 

同名のメソッドを定義すればオーバーライドできる。 C++やObject Pascal(Delphi)では予約語virtualなどで明示的に指定したメソッドのみオーバーライドできるが、Rubyではすべてのメソッドが無条件にオーバーライド可能である。

(같은 이름의 메소드를 정의하면 오버라이드(override) 할 수 있다. C++나 Object Pascal(Delphi)에서는 예약어 virtual등으로 명시적으로 지정한 메소드만 오버라이드할 수 있지만, Ruby에서는 모든 메소드가 무조건 오버라이드 가능하다.)

class C 
  def hello() 
    return "Hello" 
  end 
end 

class Sub < C 
  def hello() 
    return "Hello from Sub" 
  end 
end 

p(Sub.new().hello()) # "Hello from Sub" 표시 
p (C.new().hello()) # "Hello" 표시

 


モジュールを一言で言えば、スーパークラスを指定できず、インスタンスも作ることができないクラスだ。 定義は次のように書く。

(모듈을 한마디로 말하면 슈퍼클래스를 지정할 수 없고 인스턴스도 만들 수 없는 클래스다. 정의는 다음과 같이 쓴다.) 

スーパークラスよりモジュールが優先されるようだ。

(슈퍼 클래스보다 모듈이 우선되는 것 같다.)


定数のネスト

まず定数について復習。大文字から始まるのが定数で、次のように して定義できた。

Const = 3

そしてこの定数を参照するときは次のようにするのだった。

p(Const)   # 3を表示する

実はこれは次のようにも書ける。

p(::Const)   # 同じく3を表示する

頭に::が付くと「トップレベルで定義された定数である」ことを示す。ファイ ルシステムのパスに例えてみるといい。

class SomeClass
  Const = 3
end

p(::SomeClass::Const)   # 3と表示する
p(  SomeClass::Const)   # 同じ。3と表示する

そしてそのクラス定義にネスト している定数Constは「SomeClassの中にある」Constということで、 ::SomeClass::Constになる。

Ruby에서는 메소드 호출의 괄호를 생략할 수 있는 것이다. 

 


% Interpolated String (default)
%(Interpolated "#{language}" String (default).) # => "Interpolated \"Ruby\" String (default)."

最後に、いちおうグローバル変数もある。プログラムのどこからでも代入・参 照できるのがグローバル変数だ。変数名一文字目を$にしたのがグローバル変数 である。

$gvar = "global variable"
p($gvar)   # "global variable"と表示

RSpec : 디버깅 심화버전

minitest : 디버깅 간단 버전

 

db/migrate/~~~~~_create_~~~~.rb

:その部分のテーブルを生成するファイル。 レールズがdbに頼むコードが入っているファイル。

(db 해당 부분의 테이블 생성하는 파일. 레일즈가 db에게 부탁하는 코드가  들어있는 파일.)

 

rails db:mirgrate 

: 上記のファイルを実行されていないものがある場合に実行させるファイル。

(위의 파일들을 실행되지 않은게 있을 경우에 실행시키도록하는 파일.)

 

 


routes.rb

resource : users

패키지화 한것

(ex /users => users#index

      /users/new => users#new       

)

->app/controllers/users_controller.rb

def index

    @users = User.all

end

(여기서

모델에 가서 메소드를 불러오는 코드

그리고 무엇을 불러올 지 안 정해질 경우에는 default값을 불러온다.

default 값 : app/views/resource명/method명(action명).html.erb

여기선 : app/views/users/index.html.erb

User가 모델이 된다.?)

 


bundle exec : railsを動かすための環境を読んできて読んできた環境を実行させるという意味

(rails를 움직이기 위한 환경을 읽어와서 읽어온 환경을 실행시킨다는 의미 )

 

****중요****

rails console

controllerから情報を引き出す。

#登録されたすべてのユーザー情報を取得(등록된 모든 유저정보를 가져옴)

User.all 

 

#最初に登録されたユーザー情報を取得(첫 번째로 등록된 유저정보를 가져옴)

User.first

 

#最後に登録されたユーザー情報の取得(마지막으로 등록된 유저정보를 가져옴)

User.last

 

#最初に登録されたユーザーのid情報の取得(첫 번째로 등록된 유저의 id 정보를 가져옴)

User.first.id

 

# user_id=1のMicropostのすべての情報を取得。(user_id=1인 Micropost의 모든 정보를 가져옴.)

Micropost.find_by(user_id:1)

 

 

@id = User.first.id

Micropost.find_by(user_id: @id)

 

model에서

class User < ApplicationRecord

  has_many :microposts

end

意味 :1つのuserに複数のmicropostsの情報が入る。二つの db テーブル? 背中を繋げるところがmodel
これをviewに展開すると、「あるユーザーがした行動が現れる。

(하나의 user에 여러 microposts의 정보가 들어간다.두개의 db테이블? 등을 연결 시키는 곳이 model

이걸 이제 view에 전개하면 '한 사용자가 한 행동들이 나타나게 된다.)

model > micropost.rb

class User < ApplicationRecord

  belongs_to :user

  validates :content, length: {maximum: 140} 

end

# validatesで制限する

 


routes.rb

 

Rails.application.routes.draw do

  get 'static_pages/home'

  get ''static_pages/help'

 

  root 'application#hello'

end

 

#routes.rbで設定した値は、controller.rbでする

 

error 

ActionController::UnknownFormat in StaticPageController

->ビュー側に該当コントローラを受け取る場所がないという意味(뷰 쪽에 해당 컨트롤러 받는 곳이 없다라는 의미)

 

array.pop()

const plants = ['broccoli', 'cauliflower', 'cabbage', 'kale', 'tomato'];

console.log(plants.pop());
// expected output: "tomato"

console.log(plants);
// expected output: Array ["broccoli", "cauliflower", "cabbage", "kale"]

 

 

複数のファイルがあるときに特定の条件に合ったたった1つのファイルを見つけて、他の変数に保存したいときにArray#deleteメソッドを使えばいいと思うが。

(여러 파일이 있을 때 특정한 조건에 맞는 딱 하나의 파일을 찾아내 다른 변수에 저장하고 싶을 때, Array#delete 메소드를 사용하면 될 것 같을 때.)

files = ['Gemfile', 'LICENSE.txt', 'README.md', 'Rakefile', 'bin', 'lib', 'maliq.gemspec', 'pkg', 'spec']

gemspec = files.delete(/\.gemspec$/)
gemspec # => nil
files # => ["Gemfile", "LICENSE.txt", "README.md", "Rakefile", "bin", "lib", "maliq.gemspec", "pkg", "spec"]

残念ですが、思ったようにはいきません。 これはArray#deleteが==で同一かどうかを判断するためです。
それではArray#partitionと多重大学入試を使ってみましょう。

(안타깝지만 생각처럼 되지 않습니다. 이는 Array#delete가 ==으로 동일 여부를 판단하기 때문입니다.

그렇다면 Array#partition과 다중 대입을 사용해보죠.)

gemspec, files = files.partition { |f| f.match(/\.gemspec$/) }
gemspec # => ["maliq.gemspec"]
files  # => ["Gemfile", "LICENSE.txt", "README.md", "Rakefile", "bin", "lib", "pkg", "spec"]

できたようですが、gemspecファイルを配列で返すのが少し残念ですね。 しかし、多重大学入試+括弧を使えば解決できます。

(다 된 것 같긴 한데 gemspec 파일을 배열로 돌려주는 게 조금 아쉽네요. 하지만 다중 대입 + 괄호를 사용하면 해결할 수 있습니다.)

 

(gemspec, *_), files = files.partition { |f| f.match(/\.gemspec$/) }
gemspec # => "maliq.gemspec"
files # => ["Gemfile", "LICENSE.txt", "README.md", "Rakefile", "bin", "lib", "pkg", "spec"]

 

 


2.6.3 :003 >  (1..5).each { |i| puts 2 * i }
2
4
6
8
10
 => 1..5 

 

 

 

 


~.html.erb

<%= link_to "sample app", '#', id: "logo", class: 'nav' %>

<a href="#" id='logo' class='nav'>full_title()</a>

 

 


 

 

routes.rb의 작성법

 

ApplicationRecordは、有用なメソッドが多数定義されているActiveRecord::Baseを継承しているので、使うべきテーブル名をActiveRecord::Base.table_name=メソッドで明示的に指定できます。

class Product < ApplicationRecord
  self.table_name = "my_products"
end

これでSearchArticlesForm.category_idと使えるようになる。

ActiveModelを使うことができるようになったので、次にcategory_id author_id tag_id title bodyの検索機能を上記のメソッドを使ってsearchメソッドを作っていく。

class SearchArticlesForm
  include ActiveModel::Model
  include ActiveModel::Attributes

  attribute :category_id, :integer
  attribute :title, :string
  attribute :author_id, :integer
  attribute :tag_id, :integer
  attribute :body, :string

  def search
    relation = Article.distinct
    #distinctメソッドは重複レコードを1つにまとめるためのメソッド

    relation = relation.by_category(category_id) if category_id.present?
    relation = relation.by_author(author_id) if author_id.present?
    relation = relation.by_tag(tag_id) if tag_id.present?
#省略しているが上記は全て、Article.distinct.by_category(category_id)となっている

    title_words.each do |word|
      relation = relation.title_contain(word)
    end

    body_words.each do |word|
      relation = relation.body_contain(word)
    end

    relation
  end

  private
  #三項演算子
  #split(nil)で半角スペースのある単語は分割して調べることができる
  def title_words
    title.present? ? title.split(nil) : []
  end

  def body_words
    body.present? ? body.split(nil) : []
  end
end


showアクション設定

 

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

これは以下のように分解でき、それぞれ以下のような意味である。
Post:Postモデル。 データベースに保存されたPostのデータ
find:Postモデルで条件と一致するものを指定して取得する方法
params[:id]:findで取得してくるデータの条件
params:特定のツイートのURLを開くときなどに付いてくるデータ
:  id  :ツイートについたid

(이것은 이하와 같이 분해할 수 있고, 각각 이하와 같은 의미이다.
Post… Post 모델. 데이터베이스에 저장된 Post의 데이터
find…Post 모델에서 조건과 일치하는 것을 지정해 취득하는 방법
params[:id]:…find로 취득해 오는 데이터의 조건
params… 특정 트윗의 URL을 열 때 등에 붙어 오는 데이터
: id ... 트윗에 붙은 id)

 

つまりこれでPostモデルの中からユーザーがアクセスしようとしているpostのidに対応しているデータをピックアップしてきます、という意味になる。
@post:上を外部データ(またはビュー)でも使えるようにインスタンス変数に割り当て
そこで、インスタンス変数に割り当て、ビュー ファイルに表示できるようにします。

(즉 이것으로 Post 모델중에서 유저가 액세스하려고 하고 있는 post의 id에 대응하고 있는 데이터를 픽업해 옵니다, 라는 의미가 된다.

@post :위를 외부 데이터 (또는 뷰)에서도 사용할 수 있도록 인스턴스 변수에 할당

그래서 인스턴스 변수에 할당하여 뷰 파일에 표시 할 수 있도록합니다.)

 

実際にroute.rbを見たら(실제로 라우팅을 살펴보면)

post GET    /posts/:id(.:format)              posts#show

postsコントローラのshowアクションに対応するルーティングの経路はpost/:id である。 この:id というのがここのpost に対応しているので、showアクションと呼ぶビューには同じid のpost が表示されるようにしたい。 それでshowアクションで上に書いたように@postを定義してビューに読み込んでいるのだ。

(posts 컨트롤러의 show 액션에 대응하는 라우팅의 경로는 post/:id 이다. 이 : id라는 것이 여기의 post에 대응하고 있으므로, show 액션으로 부르는 뷰에는 같은 id의 post가 표시되도록 하고 싶다. 그래서 show 액션으로 위에 쓴 것처럼 @post 를 정의해 뷰에 읽어들이고 있는 것이다.)

 

출처 :https://qiita.com/togo_mentor/items/49f92fda95ee997ccd9b

 

rails のparams[:id]の正体 - Qiita

railsでアクションを定義するときに受け取るデータを params[:id] と表現することが多かったのだけどいまいち意味がわかっていなかったのでメモ。 同じようなことで悩んでいる方の参考になれ

qiita.com

 


User.pluck(:firstname)

User.all.map(&:firstname) # 上記と同じ

# =>  ["太郎", "二郎", "新一", "平次"]

delegate 예

class Aisatsu < ActiveRecord::Base
  def hello
    'hello'
  end

  def goodbye
    'goodbye'
  end
end

class Taro < ActiveRecord::Base
  has_one :aisatsu
  delegate :hello, to: :Aisatsu
end

taro = Taro.new
taro.hello   # => "hello"
taro.goodbye # => NoMethodError: undefined method `goodbye' for #<Foo:0x1af30c>

parseするとは

英語のparseの意味は「解析する」です。そのためJSONをparseすると言えば、JSONに記述されたデータを解析することを意味しています。

なおプログラミング言語の関数やメソッドには英単語がそのまま使われているケースが多いのですが、このparseも英単語がそのままメソッド名として使われたケースです。

そしてJavaScriptでJSONを解析するのにparseメソッドが使えますが、RubyでもJSONを解析するのにparseが使えます。

 

출처 : https://style.potepan.com/articles/28558.html


select_tag(要素名, オプションタグ=nil, オプション={}, HTML属性={} or イベント属性={})

https://railsdoc.com/page/select_tag


belongs_to 랑 has_many

 

#has_many : 연관관계가 있다는 표현. dependent: :destroy는
#inverse_of
# has_many :areas, :through => :prefectures
# has_many :prefectures_with_event_count, -> { with_event_count_tokyo }
# inverse_of : class사이간의 has_many와 belongs_to가 꼬이지 않게 도와주는 역핧

 


SomeModule::InnerModule::MyClass::CONSTANT

module SomeModule
    module InnerModule
        class MyClass
            CONSTANT = 4
        end
    end
end

scope 整理

 

https://pikawaka.com/rails/scope

 

モデルのスコープ機能(scope)の使い方を1から理解する

モデルのスコープ機能(scope)について基礎から応用的な使い方まで解説します。scopeの返り値など少し難しい部分は画像を使って丁寧に解説しています。この機能をマスターすると、保守性や

pikawaka.com