Ruby On Rails/작은 팁2011/06/13 15:00


작업을 하다보면 종종 불필요한 prefix가 붙는 경우가 생긴다.

resources :article do
  resources :article_log
end

resources :log


사실 큰 문제는 없지만, article_log path을 적어줘야 할때

article_article_log_path

이런 요상한(?) naming을 가진 path가 되어버린다.

나 같이 깔끔한 사람(응?)은 이런거 눈뜨고 못본다.
난 무슨 일이 있어도

article_log_path

이렇게 쓰고 싶어 근질할테니 말이다.
당신도 그런가? 
동지! 함께 원피스를 찾자!(응?)

이런 경우

:as 

를 써주면 우리가 원하는(설마 나만 원하는건 아니겠지?) 형태로 사용할 수 있게 된다.

resources :article do
  resources :article_log, :as => :log
end

resources :log


이렇게 :as를 추가해주게 되면

article_article_log_path

가 아닌

article_log_path

로 path가 잡히게 된다.
못믿겠으면 

rake routes

해보라!


크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Johan Kim hiphapis

TRACKBACK http://hiphapis.net/trackback/194 관련글 쓰기

댓글을 달아 주세요

Ruby On Rails/작은 팁2011/05/19 11:11


아시다시피 5월 5일 Rails 3.1 Beta 1 이 Release되었다.
많은것들이 바뀌었는데 그것들중 알고 넘어가면 좋을법한것 몇가지만 추려 간략하게 Overview해보았다.

설치

rvm 1.9.2@railspre --create
gem install rails --pre

Javascript

Rails 3.1부터 prototype.js가 아닌 jQueryCoffeeScript가  Default로 탑재되어 있다.
만약 jQuery가 아닌 prototype.js를 계속 사용하고자 할 경우,
rails new [APP_NAME] -j prototype
해주면 된다.

새로 추가된 Gems

  • sass: haml에 포함되어 있던 sass가 독립되어 나왔다.
  • coffee-script
  • uglifier: JS를 하나의 파일로 합쳐준다.
  • jquery-rails 

디렉토리 구조 변경

Public아래에 있던 Javascript, Stylesheets, Images가
/app/assets/ 로 이동되었다.
그러므로 웹엔진(Nginx등)에서 Js, Css, Image를 Rails한테 안넘기고 직접 처리하도록 세팅이 되어 있었다면, 관련 부분은 수정이 있어야 한다

Sprockets

application.css, application.js에 보면
 //= require jquery
처럼 주석처리된 require들이 있는데, 이건 주석이 아니라 sprockets의 require(include)하는 문법이므로 해당 구문을 삭제하면 include가 안된다.
 

Migration 

migration file의 change 메소드가 추가되었다. 
과거에는 up, down으로 메소드가 분리되어 있었지만, change로 통합되었다.
하지만 종종 제대로 동작하지 않을때도 있는데 그럴땐 up, down을 만들어서 사용하면 된다. 

그리고 :belongs_to가 추가되었는데, 과거 relationship을 같게 될 경우 직접 index key(article_id:integer)를 만들어 줬었다.
3.1 에서는 belongs_to를 이용하면 되는데.
rails g scaffold comment article:belongs_to body:text

이렇게 써주면되며, belongs_to로 만들면 add_index도 시켜준다.

Console

콘솔에서 DB Query가 노출이 되었는데.. 상황에 따라선 이게 과잉친절이 될 수 도 있을 듯 하다. 

Active Record

  • :has_many에서 :through를 다중깊이까지 사용할 수 있게 되었다. 
  • 그리고 :through에서 :dependent 도 지원을 한다.
  • :as 가 추가되었다.  
  • default_scope가 block으로 처리할 수 잇게 되었으며 lambda, method를 사용할 수 있다.

    default_scope { ... }
    default_scope lambda { ... }
    default_scope method(:foo)

  • update_column이 추가되었는데, update_attribute와 동작은 유사하지만 validation과 callback을 무시하고 update한다.

    User.first.update_column(:name, "sebastian") 

  • inverse_of가 추가되어서 예제 코드처럼 post.tags.build가 가능하다.

    class Post < ActiveRecord::Base
      has_many :taggings
      has_many :tags, :through => :taggings
    end

    class Tagging < ActiveRecord::Base
      belongs_to :post
      belongs_to :tag, :inverse_of => :tagging # :inverse_of must be set!
    end

    class Tag < ActiveRecord::Base
      has_many :taggings
      has_many :posts, :through => :taggings
    end

    post = Post.first
    tag = post.tags.build :name => "ruby"
    tag.save # will save a Taggable linking to the post

  • has_many의 :conditions에서 sql을 직접 쓰는것의 사용법이 바뀌었다.
    // Before
    has_many :things, :conditions => 'foo = #{bar}'

    // After
    has_many :things, :conditions => proc { "foo = #{bar}" }
  • has_secure_password라는 메소드가 추가가 되었는데, Authentication을 직접 만들어서 쓸 경우 아주 유용하게 사용할 수 있다.
    새삼스럽지만, 3.1되면서 부터 Authentication Tool은 안써도 될 듯 하다.


Action Pack 

  • auto_link가 제거되었다. 만약 계속 사용할것이라면 rails_autolink gem을 이용하면 된다.
  • :authenticity_token 을 form_tag에서 option으로 바뀌었다. 생략하거나 수정이 가능하다.
  • rhtml, rxml이 제거되었다.
  • csft_meta_tag가 복수로 rename되었다. csft_meta_tags
  • HTML5의 "data" attribute를 hash로 제공한다
    tag("div", :data => {:name => 'Johan Kim', :city_state => %w(Seoul)})


Active Support

  • Object#in?
  • weeks_ago
  • pre_week


간략하게 이 정도 인 것 같다.
관심이 있다면 https://gist.github.com/958283 를 확인하면 자세한 내역이 나온다.

http://menonrails.com/articles/14 에 기고된 포스팅 입니다.


참고링크



 

 
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Johan Kim hiphapis

TRACKBACK http://hiphapis.net/trackback/192 관련글 쓰기

댓글을 달아 주세요

  1. 这是一个伟大的后!这是非常丰富的。我期待着阅读他的工作。另外,我肯定书签您的网站,使您可以稍后再回来。我喜欢每分钟阅读。

    2011/12/20 15:32 [ ADDR : EDIT/ DEL : REPLY ]
  2. 我要感谢你为这个伟大的阅读!我绝对欣赏它的每一个点点,我中有你检查出新的东西,你张贴书签。

    2012/01/31 15:37 [ ADDR : EDIT/ DEL : REPLY ]
  3. 我要感谢你为这个伟大的阅读!我绝对欣赏它的每一个点点,我中有你检查出新的东西,你张贴书签。

    2012/01/31 15:38 [ ADDR : EDIT/ DEL : REPLY ]
  4. 这是非常丰富的。我期待着阅读他的工作。另外,我肯定书签您的

    2012/02/01 05:08 [ ADDR : EDIT/ DEL : REPLY ]
  5. 이 문서는 정말 좋았어. 당신은 확실히 같은 훌륭한 기사를 생산하는 연구에 많은 시간을 보낸 것으로 나타났습니다. 감사합니다.

    2012/02/04 16:50 [ ADDR : EDIT/ DEL : REPLY ]
  6. 개인용 컴퓨터에 대한 새로운 아이디어를 얻기 위해 나를 도와 주셔서 감사합니다. 나는 또한 최고의 상태로 노트북을 유지하는 최선의 방법 중 하나가 하나의 컴퓨터의 맨 위에 일치 아마도 하드 플라스틱 형 재료의 경우, 또는 쉘 있었던 것으로 확신합니다. 그들이 자연 케이스에 완벽하게 맞도록 제작되므로 보호 장구 이런 종류의 독특한 모델이 될 것이다. 당신은 공급 업체에서 직접 이들을 구입하거나 그들이 당신의 노트북을위한 경우 타사의 장소를 통해, 그러나 자사의 모든 노트북은 시장에 대한 지출이있을 수 있습니다. 마찬가지로 이전, 귀하의 조언에 감사드립니다.

    2012/02/07 16:09 [ ADDR : EDIT/ DEL : REPLY ]

Ruby On Rails/작은 팁2009/04/15 06:21
제목을 뭐로 해야할지 참 애매하네요.
지금 만들려고 하는 Join Table은, 같은 Model을 향하는 Join Table입니다.(말이 어렵네요. ㅎㅎ)


Subscription 이라는 Join Table은 user_id, writer_id를 가지고 있습니다.
user_id, writer_id 모두 User Model을 가르키는 ID를 가지고 있죠.

제가 하고 싶은것은
User.subscriptions # User 구독하고 있는 모든 Users
User.subscribers # User 구독하고 있는 모든 Users
입니다.


Join Table명을 (딱히 좋은 이름이 생각안나서) Subscript로 변경하겠습니다.
class Subscript < ActiveRecord::Base
    belongs_to :user
    belongs_to :writer, :foreign_key => "writer_id", :class_name => "User"
end

class User < ActiveRecord::Base
    has_many :subscripts #내(Logged User)가 구독하고 있는 User ids
    has_many :subscriptions, :through => :subscripts, :source => :writer #내가 구독하는 Users

    has_many :subscribes, :foreign_key => "writer_id", :class_name => "Subscript" #날 구독하는 User ids
    has_many :subscribers, :through => :subscribes, :source => :user #날 구독하는 Users
end

코드 설명을 세세하게 하면 싫어하실것 같아 간략하게 코드 설명을 하겠습니다.
Subscript의 writer_id를 이용하는 새로운 관계(belongs_to)를 만듭니다.
그리고 그 만든 관계명을 User에서 writer_id로 User를 불러와야 하는 곳(:subscriptions)의 :source로 써준 것이죠.

좀 찜찜하지만 이런식으로도 구현할 수 있습니다.
class User < ActiveRecord::Base
    has_many :subscripts, :dependent => :destroy
    def subscriptions
        ids = self.subscripts.collect { |s| s.writer_id }
        User.find(ids)
    end
end
확장성의 제약이 있겠지만, 사용하는것에는 큰 문제점이 없을듯 하네요
하지만.. 그래도 역시 찜찜하죠? ㅎㅎ


여담>
지금 딱 새벽 6시 20분이네요. 오랜만에 와이프 아침밥이나 해주고 자야겠네요 ㅎㅎ (라고 말하고 기절하기)
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Johan Kim hiphapis

TRACKBACK http://hiphapis.net/trackback/162 관련글 쓰기

댓글을 달아 주세요

Ruby On Rails/작은 팁2009/04/14 17:52
test/test_helper.rb 에서
class Test::Unit::TestCase
class ActiveSupport::TestCase
요렇게 바꿔주면 됩니다.

참고링크
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Johan Kim hiphapis

TRACKBACK http://hiphapis.net/trackback/161 관련글 쓰기

댓글을 달아 주세요

Ruby On Rails/작은 팁2009/04/07 23:09
environment.rb 에서 RAILS_GEM_VERSION 을 '2.2.2'로 개발중이던것을
'2.3.2'로 수정하면..
uninitialized constant ApplicationController
라는 Error Message가 뜹니다.

Rails가 2.3 으로 Update 하면서 application.rb 가 application_controller.rb 로 변경이 되어서 생기는 문제점입니다.

직접 application.rb 파일을 rename 해주거나.
rake rails:update:application_controller 
이런식으로 rake를 해주셔도 됩니다.

저는 rake를 사용해서 작업했습니다.
이제 잘 되네요 :)

관련링크

덧.
위에 적은 rake는 rake rails:update에 포함되어 있다고 하네요.
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Johan Kim hiphapis

TRACKBACK http://hiphapis.net/trackback/160 관련글 쓰기

댓글을 달아 주세요

Ruby On Rails/작은 팁2009/03/10 11:28
간만에 gem update 했는데.. mime-types에서 Error가 난다.
아쉽게도 Error문구를 기록을 못했는데..
libxslt가 없다면서 나는 에러였다.

libxslt가 뭔지 궁금해서 찾아봤는데 XSLT 란다.
XSLT는 Extensible Stylesheet Language Transformations 의 약자로, 쉽게 말해 XML을 다른형태로 바꿔주는 XML변신기 라고 보면 된다.

mime-types에서 쓸일이 없을것 같기도 하면서도, 왠지 쓸거 같기도 한 애매모호한 놈이다.
뭐 update를 안시켜주는데 별 수 있나.. 설치해줘야지

방법은 간단한다
emerge -av libxslt
dependent  묻는거 나오면 그냥 Enter 한번 눌러주면 된다. (물런 필요나 의도에 의해 No를 할 수 도 있음.)

간만에 emerge sync랑 world complie 하니.. 시간이 조금.. 크헉!
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Johan Kim hiphapis

TRACKBACK http://hiphapis.net/trackback/157 관련글 쓰기

댓글을 달아 주세요

  1. 데비안은 바이너리라서 간편합니다. :) 데비안으로 오세요~~

    2009/03/13 00:47 [ ADDR : EDIT/ DEL : REPLY ]

Ruby On Rails/작은 팁2008/04/21 11:37
흠..멋진걸..!! -ㅅ-;
확인해보니 host가 있는건 전부 이러네..
rubyonrails.org 만 제대로 뜨고;;
사용자 삽입 이미지

크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Johan Kim hiphapis

TRACKBACK http://hiphapis.net/trackback/122 관련글 쓰기

댓글을 달아 주세요