xhive 1.6.2 → 1.6.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/README.md CHANGED
@@ -268,6 +268,46 @@ end
268
268
 
269
269
  Using this feature you can let the designers implement the HTML/CSS to display the posts in your site without your intervention.
270
270
 
271
+ ## Page mounting
272
+
273
+ You can also add pages to your ActiveRecord model using the *mount_page* statement:
274
+
275
+ ```ruby
276
+ class Post < ActiveRecord::Base
277
+ mount_page :mini
278
+ mount_page :full
279
+ end
280
+
281
+ mini_page = Xhive::Page.create(:name => 'mini-post', :title => 'Minimized Post', :content => "<a href='/posts/{{post.id}}'>{{post.title}}</a>")
282
+ full_page = Xhive::Page.create(:name => 'post', :title => 'Post', :content => "<h1>{{post.title}}</h1><p>{{post.body}}</p>")
283
+
284
+ post = Post.create(:title => "My awesome post", :body => "This is an awesome post!")
285
+ post.mini = mini_page
286
+ post.full = full_page
287
+ ```
288
+
289
+ Then you can display the pages in a view:
290
+
291
+ ```ruby
292
+ <% # Render minimized content %>
293
+ <%= post.mini_page_content %>
294
+
295
+ <% # Render full content %>
296
+ <%= post.full_page_content %>
297
+ ```
298
+
299
+ You get:
300
+
301
+ ```html
302
+ <a href='/posts/1'>My awesome post</a>
303
+
304
+ <h1>My awesome post</h1><p>This is an awesome post!</p>
305
+ ```
306
+
307
+ The post object gets injected into the page render method so you can use all its attributes inside the page.
308
+
309
+ Caveat: the mount_page statement currently supports single-site use. Multi-site support is intented to be added in the near future.
310
+
271
311
  ## Policy based mapping
272
312
 
273
313
  If you need more customization in the page mapping process, you can pass a policy class name as the last attribute.
@@ -46,7 +46,11 @@ module Xhive
46
46
  def filter_images_urls(content)
47
47
  images_path = base_images_path
48
48
  # This only works if string is interpolated o_O
49
- "#{content}".gsub(/src\=['"]?#{images_path}\/([^\'^\"]+)['"]?/) {|| "src='#{url_for('image', $1)}'"}
49
+ "#{content}".gsub(/src\=['"]?#{images_path}\/([^\'^\"]+)['"]?/) {|| "src='#{image_url($1)}'"}
50
+ end
51
+
52
+ def image_url(image)
53
+ url_for('image', image).gsub(/http:|https:/,'')
50
54
  end
51
55
 
52
56
  def log_error(e)
@@ -1,2 +1,2 @@
1
- <%= @page.presenter.render_content %>
1
+ <%= @page.presenter.render_content.html_safe %>
2
2
 
@@ -1,8 +1,3 @@
1
- require "xhive/engine"
2
-
3
- module Xhive
4
- end
5
-
6
1
  require 'xhive/hashy'
7
2
  require 'xhive/liquid_wrapper'
8
3
  require 'xhive/mailer'
@@ -12,3 +7,10 @@ require 'xhive/router'
12
7
  require 'xhive/base_tag'
13
8
  require 'xhive/tag_factory'
14
9
  require 'xhive/widgify'
10
+ require 'xhive/active_record_extensions'
11
+
12
+ require "xhive/engine"
13
+
14
+ module Xhive
15
+ end
16
+
@@ -0,0 +1,37 @@
1
+ module Xhive
2
+ module ActiveRecordExtensions
3
+ extend ActiveSupport::Concern
4
+
5
+ module ClassMethods
6
+ def mount_page(attr)
7
+ # Define getter
8
+ define_method(attr.to_s) do
9
+ # TODO: support multiple sites
10
+ site = Xhive::Site.first
11
+ begin
12
+ page = Xhive::Mapper.page_for(site, self.class.name.downcase, attr.to_s, id)
13
+ rescue ActiveRecord::RecordNotFound
14
+ page = nil
15
+ end
16
+ return page
17
+ end
18
+
19
+ # Define setter
20
+ define_method("#{attr}=") do |value|
21
+ fail RecordNotPersistedError, "Cannot assign a page to an unsaved #{self.class.name}" if new_record?
22
+ # TODO: support multiple sites
23
+ site = Xhive::Site.first
24
+ page = value.is_a?(Xhive::Page) ? value : site.pages.find(value)
25
+ Xhive::Mapper.map_resource(site, page, self.class.name.downcase, attr.to_s, id)
26
+ end
27
+
28
+ # Define content
29
+ define_method("#{attr}_content") do
30
+ self.send(attr.to_sym).present_content(self.class.name.downcase.to_sym => self)
31
+ end
32
+ end
33
+ end
34
+
35
+ class RecordNotPersistedError < StandardError; end
36
+ end
37
+ end
@@ -22,5 +22,6 @@ module Xhive
22
22
  Xhive::Router::Cells.process_routes
23
23
  end
24
24
  end
25
+ ActiveRecord::Base.send(:include, Xhive::ActiveRecordExtensions)
25
26
  end
26
27
  end
@@ -1,3 +1,3 @@
1
1
  module Xhive
2
- VERSION = "1.6.2"
2
+ VERSION = "1.6.4"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: xhive
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.2
4
+ version: 1.6.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-12-21 00:00:00.000000000 Z
12
+ date: 2013-02-06 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
@@ -250,6 +250,7 @@ files:
250
250
  - db/migrate/20121101124925_create_xhive_images.rb
251
251
  - db/migrate/20121127230527_add_policy_to_xhive_mappers.rb
252
252
  - lib/tasks/xhive_tasks.rake
253
+ - lib/xhive/active_record_extensions.rb
253
254
  - lib/xhive/base_tag.rb
254
255
  - lib/xhive/controller.rb
255
256
  - lib/xhive/engine.rb
@@ -284,7 +285,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
284
285
  version: '0'
285
286
  segments:
286
287
  - 0
287
- hash: 1465985521078012913
288
+ hash: -803175819629715449
288
289
  required_rubygems_version: !ruby/object:Gem::Requirement
289
290
  none: false
290
291
  requirements:
@@ -293,7 +294,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
293
294
  version: '0'
294
295
  segments:
295
296
  - 0
296
- hash: 1465985521078012913
297
+ hash: -803175819629715449
297
298
  requirements: []
298
299
  rubyforge_project:
299
300
  rubygems_version: 1.8.21