ubuntu, ror, jQuery, css, website memo
太嫩, 沒啥心得, 用來紀錄每天學的
2009年9月10日 星期四
Railscast skill (5)
Refactoring Out Helper Object
某些 method 需要很多其他的小 method 可是放在application helper 裡 又不是算大家都會用到的東西, 這時候就可以把它搬到外面弄成一個class,
<br /># application_helper.rb<br />def render_stars(rating)<br /> #傳self 進去<br /> StarsRenderer.new(rating, self).render_stars<br />end<br /><br /># helpers/stars_renderer.rb<br />class StarsRenderer<br /> def initialize(rating, template)<br /> @rating = rating<br /> @template = template<br /> end<br /> <br /> def render_stars<br /> content_tag :div, star_images, :class => 'stars'<br /> end<br /><br /> private<br /> <br /> def star_images<br /> (0...5).map do |position|<br /> star_image(((@rating-position)*2).round)<br /> end.join<br /> end<br /> <br /> def star_image(value)<br /> image_tag "/images/#{star_type(value)}_star.gif", :size => '15x15'<br /> end<br /> <br /> def star_type(value)<br /> if value <= 0<br /> 'empty'<br /> elsif value == 1<br /> 'half'<br /> else<br /> 'full'<br /> end<br /> end<br /> <br /> #好技巧<br /> def method_missing(*args, &block)<br /> @template.send(*args, &block)<br /> end<br />end<br />
Site Wide Announcements
又用了controller 的 javascripts 的技巧 不過這邊這個要注意一下 route 要加上format
<br /><!-- layouts/application.html.erb --><br /># helper method 後面直接可以接method ㄟ 棒<br /><% unless current_announcements.empty? %><br /><div id="announcement"><br /> <% for announcement in current_announcements %><br /> <p><%=h announcement.message %></p><br /> <% end %><br /> <p><%= link_to_remote "Hide this message", :url => "/javascripts/hide_announcement.js" %></p><br /></div><br /><% end %><br /><br /># models/announcement.rb<br /># 注意一下with_scope 用法<br />def self.current_announcements(hide_time)<br /> with_scope :find => { :conditions => "starts_at <= now() AND ends_at >= now()" } do<br /> if hide_time.nil?<br /> find(:all)<br /> else<br /> find(:all, :conditions => ["updated_at > ? OR starts_at > ?", hide_time, hide_time])<br /> end<br /> end<br />end<br /><br /># application_helper.rb<br /># 直接用session 來記有沒有看過 GOOD<br />def current_announcements<br /> @current_announcements ||= Announcement.current_announcements(session[:announcement_hide_time])<br />end<br /><br /># javascripts_controller.rb<br />def hide_announcement<br /> session[:announcement_hide_time] = Time.now<br />end<br /><br /># hide_announcement.js.rjs<br />page[:announcement].hide<br /><br /># routes.rb<br />map.connect ":controller/:action.:format"<br />
沒有留言:
張貼留言
較新的文章
較舊的文章
首頁
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言