학습일지
@초록머리님이 위키 내용을 고쳤습니다.

초록머리 레일즈 학습일지

--- 위로 자라는 위키입니다 ---

181129

user.save(validate: false) 를 사용해 validate 없이 save할 수 있다.

181120

Enumerable 메소드를 정리한 글 https://blog.nacyot.com/articles/2014-04-19-ruby-enumerable/ 

181109

https://www.shortcutfoo.com/app/dojos/ruby-arrays/cheatsheet

루비 array 치트 시트를 발견했다.

181018

rails에서 vendors asset을 사용하고 싶으면 asset.rb에 Rails.application.config.assets.precompile += %w( vendors.css ) 를 추가해준다. 

181012

https://stackoverflow.com/questions/4252349/rails-where-condition-using-not-null

Foo.includes(:bar)
   .references(:bar)
   .merge(Bar.where.not(id: nil))

셀렉트 마스터 하기

181004

웹폰트를 적용하기 위해서는

assets/fonts/font.otf, ttf, wof ....

에 값을 넣고

scss에서 font_url('font.otf ...') 를 사용하면 주소를 지정할 수 있다.

보통 @font-face {
font-family: 'NotoSerif-Bold';
src: font_url('NotoSerifCJKkr-Bold-subset');
src: font_url('NotoSerifCJKkr-Bold-subset.woff') format("woff"),
font_url('NotoSerifCJKkr-Bold-subset.woff2') format("woff2");
font-weight: normal;
font-style: normal;
}

이렇게 쓴다.

180912

loop() public

Repeatedly executes the block.

If no block is given, an enumerator is returned instead.

loop do
  print "Input: "
  line = gets
  break if !line or line =~ /^qQ/
  # ...
end

180904

DIFFERENT WAYS TO RUN SHELL COMMANDS IN RUBY

exec로 shell script를 실행해 본다.

180830

Person.pluck(:name) Person
instead of Person.all.map(&:name)
하나의 컬럼만 select하고 싶을 때 쓴다.

180829

텍스트 객체에 squish() 메소드를 사용하면 탭과 줄바꿈을 제거할 수 있습니다.

180810

ultrahook : 다른 서비스들의 웹훅의 엔드포인트를 개발환경으로 받아볼 수 있다.

180802

새로운 gem 발견!! 바로 letter_opener_web 이다. 가크 개발하면서 발견함!

개발용으로 메일러로 보낸 메일을 확인하는 인터페이스를 제공한다! 개꿀.

180730

rails 3 ajax

THE DIFFERENCE BETWEEN JQUERY'S .BIND(), .LIVE(), AND .DELEGATE()

많이 쓰이는 잼 : acts-as-taggable-on

@user.tag_list.add("awesome")   # add a single tag. alias for <<
                                                                                    @user.tag_list.remove("awesome") # remove a single tag
                                                                                    @user.save # save to persist tag_list

180726 

dirty check jquery plugin

 

180718

application_controller.rb의 smart_search_for 메소드에서

gem 'scoped_search', '~> 4.1' 을 사용하고 있다는 것을 발견 - 깃헙

member.rb 

31: scoped_search relation: :user, on: [:nickname]
32: scoped_search relation: :user, on: [:nickname, :email], profile: :admin

current_user 가 admin인 경우(=profile:이 admin)는 nickname과 email 모두로 검색이 가능함.

 

180717

counter_cache : true , reset_counters()

Procs, blocks and anonymous functions

레일즈 가이드 라우팅

초레가2

180713

present? vs any? vs exists?

  • present?는 blank의 정 반대의 기능을 한다. 공백이거나 length가 0인 상태가 아닌 경우 true이다.
  • any?는 false와 nil을 반환하지 않고 값이 뭐라도 있으면 true이다.
  • exists?는 항상 DB에 조회를 한다. 그러니까 미리 로딩된 값이 있어도 그 쿼리를 다시 조회한다.대신, LIMIT 1 의 옵션이 있기 떄문에 present?와 any?보다 보통 아주 빠르게 작동한다. 벤치마크 결과는 아래와 같다.

present는 엄청나게 느리다.

nil? vs empty? vs blank?

  • nil?은 오로직 nil 일때만 true 이다.
  • empty?는 string, has, array의 길이가 0일 때의 상태를 말한다. nil에 empty?를 호출하면 NomethodError를 호출한다.
  • blank?는 empty?와 같이 작동하는데, space bar 로만 이루어진 string 또한 blank인 상태로 본다.

- 참조

180712

ROR 101 연습

  • 오전 1시간 : scaffold 없이 devise gem 만들기 전 까지 성공.
  • 여전히 create, update 등을 전의 소스를 참조하지 않으면 헤멘다.

빠띠에 포함된 gem 분석

* enumerize

extend Enumerize
enumerize :plan, in: [:premium, :lite, :trial], predicates: true, scope: true

C나 Java의 Enum 처럼 쓸 수 있게 해주는 gem. 

Enumerated attributes with I18n and ActiveRecord/Mongoid support

<%= form_for @user do |f| %>
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  <%= f.select :sex, User.sex.options %>
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                <% end %>

위 처럼 options 이렇게 쓸 수 있다.

recursive-open-struct

OpenStruct subclass that returns nested hash attributes as RecursiveOpenStructs.

ros = RecursiveOpenStruct.new( { wha: { tagoo: 'siam' } } )
ros.wha.tagoo # => 'siam'

위처럼 hash를 체인 메소드로 쓸 수 있게 해줍니다.

근데, 빠띠xyz에서 현재 쓰고 있는 곳이 한 곳도 없다.

* time_differnece

start_time = Time.new(2013,1)

end_time = Time.new(2014,1)

TimeDifference.between(start_time, end_time).in_years

=> 1.0

TimeDifference.between(start_time, end_time).in_months

=> 12.0

TimeDifference.between(start_time, end_time).in_weeks

=> 52.14

두 시간의 차이를 시/분/초/달/주 등으로 계산하기 쉽게 메소드를 제공하는 잼이다.

근데, 빠띠xyz에서 현재 쓰고 있는 곳이 한 곳도 없다.

* naught

Naught is a toolkit for building Null Objects in Ruby.

require 'naught'
                                                                                                                                                                                                                                                                                                                                                                                                                                                            
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    NullObject = Naught.build
                                                                                                                                                                                                                                                                                                                                                                                                                                                            
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    null = NullObject.new
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    null.foo                        # => nil
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    null.bar                        # => nil

Null Object를 관리할 수 있다. 온갖 방식으로 null을 표현할 수 있다. 신기. blackHole을 쓰면 null을 아무리 chanining해도 에러가 안남.

근데, 빠띠xyz에서 현재 쓰고 있는 곳이 한 곳도 없다.

* paranoia

팬텀 딜리트(여기서는 soft-delete라고 부른다)를 자동으로 구현해주는 gem 이다. 오늘 찾은 gem 중에 가장 소득이 큰 잼이다. 언제 이 gem이 적용되었는지 검색해 보았더니, "20160312102740_add_deleted_at_to_models.rb" 무려 2년도 전에 적용됨 ㅋㅋ 적용된 부분은 다음과 같다.

class AddDeletedAtToModels < ActiveRecord::Migration
  def change
    %i(answers articles comments discussions issues opinions posts proposals users).each do |tablename|
      add_column tablename, :deleted_at, :datetime
      add_index tablename, :deleted_at
    end
  end
end

복구하고 싶으면 restore 메소드를, 정말로 지우고 싶으면 really_destroy! 메소드를 사용해야 한다. 아직 빠띠xyz에는 really_destroy! 메소드를 쓰는 곳은 없다.

 

180709

일감 : catan-web 쓰인 차트 라이브러리 분석

예측 시간 : 2시간 || 소요 시간 : 3시간

= line_chart @data.map { |r| { name: r[0].model_name.human, data: r[1] } }, defer: true, points: false, download: true

문장 분석하기

  1. line_chart : chartkick 잼에서 지원하는 helper. 뒤의 옵션은 gem 사용법을 참조하면 있다.
  2. Object.model_name.human : i18N에서 기본적으로 지원하는 메소드로 우리 프로젝트에서는 ko.yml 참조한다. 레일즈 가이드 http://guides.rubyonrails.org/i18n.html 천천히 읽어봐야겠다고 생각했다
  3. @data에는 무슨 값이 들어있을까?

@data = [Post, Comment, Upvote].map do |m|

        selected = m.between_times(@from, @to).where(user: @user).group_by_day("#{m.model_name.plural}.created_at").count

        [

          m,

          Hash[(@from ... @to).map { |date| [date, selected[date] || 0] }]

        ]

    • 제일 처음 블록에서 r[0] = m, r[10] = Hash값임을 있다.
    • [Object, Object, Object].map do |블록| 같이 사용하는 구문을 처음 보았는데 정확히 어떻게 동작하는 Tutorial 블로그에서 실험이 필요하다.
    • 유추하기로는 Post, Comment, Upvote 횟수를 일자별로 group_by 값들을 count해서 곧바로 Array 집어넣는듯 하다.

4. 덕분에 자주 쓰는 https://union.parti.xyz/posts/20328 위키를 업데이트했다. 예측하지 못한 편집이라 소요시간이 들었다.

배운 점 : 새로운 gem들을 알았고 catan_web에서 내가 쉽게 코드를 읽지 못하는 것은 여러 gem들에서 지원하는 메소드들 때문이라는 것을 알았다. 빠른 시간 내에 각각 gem 어떤 역할을 하는 대강이나마 감을 잡으면 새로운 기능을 추가할 빠르게 접근할 있을 같다.

피드백 : 뽀모도로 타이머로 시간을 끊어서 사용해서 낭비를 줄였다. 뿌듯.

다음할일 : 데이터 시각화가 필요한 부분을 찾아서 시각화한다.

 

180614 ROR 101 3차 시기

  • scaffold 사용하지 않고 해보기.
    • 글쓰기 폼에 툴을 붙여보기 전까지, 1시간 14분 소요.
    • 대신, model generate는 사용. 다음번에는 generate 없이 해보기.
    • 중간에 막히면, 이전에 scaffold로 만든 소스, 카탄 웹 등 참조
    • 배운 점
      • CRUD를 수행하는 메소드들과 조금 더 친해짐.
      • 기존 소스에서 불필요한 부분 걷어냄. (json builder 같이)

180531 ROR 101 완성

180509

polymorphic assosiation 공부, 댓글 create 성공, 피드백 작성

180508

cancancan 성공, 댓글 create 실패

180507

1. carrierwave를 사용해 이미지 업로드, ckeditor를 사용해 텍스트 편집 성공

180504

1. 파일 업로드는 carrierwave, 에디터는 ckeditor를 쓰기로 정함

2. carrierwave gem 설치 시도, 실패

180503

레일즈 튜토리얼 북 분석 (https://www.railstutorial.org/book)

  1. 결과물 : 미니 트위터. 회원가입, 글쓰기, 내 피드에 올라가고, 다른 사람을 팔로잉 할 수 있는 간단한 수준의 서비스
  2. 정말 처음부터 끝까지 내가 다 만듬. 라이브러리 쓰는 게 부트스트랩 말고 거의 없음(이미지 업로드 등은 씀).
  3. 로그인, 권한 관리, 메일러 몽땅 다 내가 구현 ( ROR 101에서는 devise, cancanacan등을 사용)
  4. 모든 과정을 친절하게 다 테스트 기반으로 되어 있어서, 초보자가 욕심내지 않고 진득하게 오래 따라해서 공부면 깊은 배움을 얻을 수 있을 듯!
  5. 간간히, 루비 언어의 특성을 사용할 수 있는 부분들도 있음. ( 메타 프로그래밍 이라던지 )

180502

ROR 101 문서 분석

  1. 포스트를 만든다.
  2. 카테고리를 만든다.
  3. 카테고리가 있는 포스트를 만든다.
  4. devise gem을 사용해 로그인 기능을 만든다.
  5. 포스트에 파일 업로드 기능을 추가한다.
  6. 텍스트 에디터를 적용한다.
  7. cancancan을 이용해 권한설정을 적용한다.
  8. 포스트에 달리는 댓글을 만든다.

 

180501

2시간 게시판 만들기 도전 : 실패

  1. 카테고리 생성 가능
  2. 글쓰기 가능
  3. 회원 가입 불가능
  4. 회원 로그인 불가능

* 실패 요인

  1. generate 명령어랑 그다지 친하지 못함.
  2. 카테고리와 글을 관계를 맺는 데서 시간을 엄청 많이 씀.
    1. model 관련 튜토리얼을 읽어봐야 할 것 같음.
    1. 황급히 완성을 하려고 하다 보니 적당히 되게 만드는 데 시간을 썼는데, 작동만 하고 뭘 알고 쓴 것 같지 않음. 다시 확인해 봐야 할 부분.
    2. 101 기준으로 24번 정도까지밖에 따라가지 못함.
    3. model, model 사이의 관계에 대해서 이해하지 못하고 있는 같다.
  3. 무슨_무슨_path 에 대해 정확히 이해하지 못하고 있는 것 같다.
  4. 로그인을 포함한 블로그를 만드는 세부 작업에 대한 그림을 디테일하게 모르는 것 같다.

* 생각

  • 우선 시간에 구애받지 않고 천천히 101을 죽 따라해 보는 것이 좋을 것 같다.

180430

10강 : 유저를 수정하고, 보여주고, 삭제하기

180427

9강 : 우수한 로그인

  • 쿠키로 사용자의 상태를 가지고 있을 수 있다.
  • 쿠키를 오래 남겨놔서 로그인된 상태 기억하기를 만들 수 있다.
  • 로그아웃 하면 세션을 취소하고 쿠키를 삭제할 수 있다.
  • 레일즈도 3항 연산자를 쓸 수 있다.

그 전, https://www.railstutorial.org/book 의 튜토리얼을 진행중이었음. 빨리 끝내고 ROR 101을 매일 연습하는 궤도에 진입할 예정!

작성
공감해요
4
달리 최근 업그레이드 된 레일즈 내용은 잘 팔로업 못하는 달리인데요. 이 튜터리얼 보고 빠띠에서 쓰면 좋겠다싶은 게 걸리면 좋겠습니다.
초록머리 2시간 게시판 만들기 도전을 피드백을 추가하였습니다.
달리 @초록머리 101만 따로 위키로 빼주세요. 아주 쓸모있는 콘텐츠네요.
초록머리 Gemfile의 model에 포함된 5개의 gem을 읽어보았습니다.
달리 처음 공부할 때 procs와 block을 나뉘게 된 계기가 궁금하더라고요.
기술 가이드 빠띠의 다른 게시글 더 보기
기술 가이드 빠띠의 다른 게시글 더 보기
기술 가이드 빠띠는? 자세히 보기
빠띠에 쓰이는 기술을 소개하고 그 기술을 익히기 위한 가이드를 모읍니다.
기술 가이드 빠띠에 가입해서 흥미진진한 소식을 받아보세요.
가입하기