alchemy_cms 2.2.rc8 → 2.2.rc11
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 +1 -1
- data/app/assets/javascripts/alchemy/alchemy.page_sorter.js +1 -1
- data/app/assets/stylesheets/alchemy/sitemap.css.scss +14 -13
- data/app/assets/stylesheets/alchemy/standard_set.css +9 -10
- data/app/controllers/alchemy/admin/pages_controller.rb +1 -0
- data/app/controllers/alchemy/base_controller.rb +2 -1
- data/app/helpers/alchemy/admin/essences_helper.rb +1 -0
- data/app/helpers/alchemy/elements_helper.rb +2 -10
- data/app/helpers/alchemy/essences_helper.rb +1 -0
- data/app/helpers/alchemy/pages_helper.rb +31 -13
- data/app/models/alchemy/attachment.rb +1 -1
- data/app/models/alchemy/content.rb +8 -8
- data/app/models/alchemy/element.rb +14 -10
- data/app/models/alchemy/essence_file.rb +1 -1
- data/app/models/alchemy/message.rb +9 -9
- data/app/models/alchemy/page.rb +4 -3
- data/app/models/alchemy/picture.rb +1 -1
- data/app/models/alchemy/user.rb +1 -1
- data/app/sweepers/alchemy/content_sweeper.rb +29 -6
- data/app/views/alchemy/admin/attachments/new.html.erb +1 -1
- data/app/views/alchemy/admin/pages/index.html.erb +7 -7
- data/app/views/alchemy/admin/pages/sort.js.erb +2 -1
- data/app/views/alchemy/admin/partials/_upload_form.html.erb +2 -2
- data/app/views/alchemy/admin/pictures/new.html.erb +1 -1
- data/app/views/alchemy/essences/_essence_picture_tools.html.erb +2 -2
- data/app/views/alchemy/essences/_essence_text_editor.html.erb +11 -11
- data/app/views/alchemy/navigation/_link.html.erb +20 -20
- data/app/views/alchemy/navigation/_renderer.html.erb +37 -23
- data/config/alchemy/config.yml +107 -65
- data/config/alchemy/elements.yml +12 -1
- data/config/locales/alchemy.de.yml +1 -0
- data/config/locales/alchemy.en.yml +1 -0
- data/lib/alchemy/essence.rb +1 -1
- data/lib/alchemy/page_layout.rb +3 -9
- data/lib/alchemy/resource.rb +5 -5
- data/lib/alchemy/version.rb +1 -1
- data/lib/rails/generators/alchemy/scaffold/scaffold_generator.rb +2 -2
- data/lib/rails/generators/alchemy/scaffold/{files/page_layouts.yml → templates/page_layouts.yml.tt} +4 -0
- data/spec/config_spec.rb +1 -1
- data/spec/dummy/db/schema.rb +1 -1
- data/spec/helpers/admin/contents_helper_spec.rb +4 -3
- data/spec/helpers/admin/essences_helper_spec.rb +4 -8
- data/spec/helpers/essences_helper_spec.rb +0 -4
- data/spec/helpers/pages_helper_spec.rb +10 -1
- data/spec/integration/admin/modules_integration_spec.rb +25 -21
- data/spec/integration/admin/pages_controller_spec.rb +16 -19
- data/spec/integration/admin/resources_integration_spec.rb +58 -64
- data/spec/integration/pages_controller_spec.rb +24 -3
- data/spec/integration/security_spec.rb +12 -12
- data/spec/libraries/resource_spec.rb +16 -18
- data/spec/models/page_spec.rb +352 -326
- data/spec/page_layout_spec.rb +2 -2
- data/spec/support/alchemy/specs_helpers.rb +16 -1
- metadata +116 -38
- data/spec/support/integration_spec_helper.rb +0 -24
data/README.md
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
Alchemy CMS
|
2
2
|
===========
|
3
3
|
|
4
|
-
[](http://travis-ci.org/magiclabs/alchemy_cms)
|
5
5
|

|
6
6
|
|
7
7
|
About
|
@@ -32,7 +32,7 @@ if (typeof(Alchemy) === 'undefined') {
|
|
32
32
|
$.post(Alchemy.routes.order_admin_pages_path, params);
|
33
33
|
return false;
|
34
34
|
});
|
35
|
-
$('#
|
35
|
+
$('#sort_panel .button').click(Alchemy.pleaseWaitOverlay);
|
36
36
|
Alchemy.PageSorter.disableButton();
|
37
37
|
Alchemy.resizeFrame();
|
38
38
|
},
|
@@ -1,22 +1,23 @@
|
|
1
1
|
@import "alchemy/defaults";
|
2
2
|
|
3
|
-
div#
|
3
|
+
div#sort_panel {
|
4
|
+
background: $medium-gray;
|
5
|
+
padding: 60px 0 8px 0;
|
4
6
|
position: fixed;
|
5
|
-
|
6
|
-
|
7
|
-
width: 100%;
|
7
|
+
top: 27px;
|
8
|
+
left: 0;
|
8
9
|
z-index: 10;
|
9
|
-
|
10
|
-
|
10
|
+
width: 100%;
|
11
|
+
border-bottom: $default-border;
|
11
12
|
|
12
|
-
div
|
13
|
-
|
14
|
-
|
15
|
-
}
|
13
|
+
div.info {
|
14
|
+
margin: 8px 8px 8px 104px;
|
15
|
+
width: 720px;
|
16
|
+
}
|
16
17
|
|
17
|
-
div
|
18
|
-
|
19
|
-
|
18
|
+
div.buttons {
|
19
|
+
margin: 0 0 8px 104px;
|
20
|
+
}
|
20
21
|
}
|
21
22
|
|
22
23
|
.sitemap_pagename_link {
|
@@ -146,18 +146,17 @@ div#header_image {
|
|
146
146
|
background-color: #ffa300;
|
147
147
|
}
|
148
148
|
|
149
|
-
#navigation ul.
|
149
|
+
#navigation ul.navigation.level_1 li {
|
150
150
|
display: inline;
|
151
151
|
float: left;
|
152
152
|
}
|
153
153
|
|
154
|
-
#navigation ul.
|
155
|
-
#navigation ul.navigation_level_-1 li {
|
154
|
+
#navigation ul.navigation.level_2 li {
|
156
155
|
display: block;
|
157
156
|
float: none;
|
158
157
|
}
|
159
158
|
|
160
|
-
#navigation ul.
|
159
|
+
#navigation ul.navigation.level_3 li {
|
161
160
|
|
162
161
|
}
|
163
162
|
|
@@ -165,7 +164,7 @@ div#header_image {
|
|
165
164
|
background-color: #c0c0c0;
|
166
165
|
}
|
167
166
|
|
168
|
-
#navigation ul.
|
167
|
+
#navigation ul.navigation.level_2 > li.last {
|
169
168
|
|
170
169
|
}
|
171
170
|
|
@@ -181,7 +180,7 @@ div#header_image {
|
|
181
180
|
color: #fff;
|
182
181
|
}
|
183
182
|
|
184
|
-
#navigation ul.
|
183
|
+
#navigation ul.navigation.level_2 {
|
185
184
|
display: none;
|
186
185
|
position: absolute;
|
187
186
|
z-index: 10;
|
@@ -191,22 +190,22 @@ div#header_image {
|
|
191
190
|
clear: both;
|
192
191
|
}
|
193
192
|
|
194
|
-
#navigation ul.
|
193
|
+
#navigation ul.navigation.level_3 {
|
195
194
|
display: none;
|
196
195
|
z-index: 20;
|
197
196
|
background-color: white;
|
198
197
|
float: none;
|
199
198
|
}
|
200
199
|
|
201
|
-
#navigation ul.
|
200
|
+
#navigation ul.navigation.level_3 li {
|
202
201
|
padding-left: 20px;
|
203
202
|
}
|
204
203
|
|
205
|
-
#navigation ul.
|
204
|
+
#navigation ul.navigation.level_1 li:hover ul.navigation.level_2 {
|
206
205
|
display: block;
|
207
206
|
}
|
208
207
|
|
209
|
-
#navigation ul.
|
208
|
+
#navigation ul.navigation.level_2 li:hover ul.navigation.level_3 {
|
210
209
|
display: block;
|
211
210
|
}
|
212
211
|
|
@@ -10,6 +10,7 @@ module Alchemy
|
|
10
10
|
filter_access_to [:index, :link, :layoutpages, :new, :switch_language, :create, :move, :flush], :attribute_check => false
|
11
11
|
|
12
12
|
cache_sweeper Alchemy::PagesSweeper, :only => [:publish], :if => proc { Alchemy::Config.get(:cache_pages) }
|
13
|
+
cache_sweeper Alchemy::ContentSweeper, :only => [:create, :update, :destroy]
|
13
14
|
|
14
15
|
def index
|
15
16
|
@page_root = Page.language_root_for(session[:language_id])
|
@@ -129,7 +129,8 @@ module Alchemy
|
|
129
129
|
if exception
|
130
130
|
logger.info "Rendering 404: #{exception.message}"
|
131
131
|
end
|
132
|
-
|
132
|
+
@page = Page.language_root_for(session[:language_id])
|
133
|
+
render :file => "#{Rails.root}/public/404", :status => 404, :layout => !@page.nil?
|
133
134
|
end
|
134
135
|
|
135
136
|
protected
|
@@ -46,6 +46,7 @@ module Alchemy
|
|
46
46
|
# Renders the Content editor partial from the given Element by position (e.g. 1).
|
47
47
|
# For options see -> render_essence
|
48
48
|
def render_essence_editor_by_position(element, position, options = {})
|
49
|
+
ActiveSupport::Deprecation.warn 'Alchemy CMS: render_essence_editor_by_position is not supported anymore and will be removed.'
|
49
50
|
if element.blank?
|
50
51
|
warning('Element is nil')
|
51
52
|
return ""
|
@@ -59,7 +59,6 @@ module Alchemy
|
|
59
59
|
unless options[:sort_by].blank?
|
60
60
|
all_elements = all_elements.sort_by { |e| e.contents.detect { |c| c.name == options[:sort_by] }.ingredient }
|
61
61
|
end
|
62
|
-
all_elements.reverse! if options[:reverse_sort] || options[:reverse]
|
63
62
|
element_string = ""
|
64
63
|
if options[:fallback]
|
65
64
|
unless all_elements.detect { |e| e.name == options[:fallback][:for] }
|
@@ -88,9 +87,6 @@ module Alchemy
|
|
88
87
|
}
|
89
88
|
options = default_options.merge(options)
|
90
89
|
element.store_page(@page) if part == :view
|
91
|
-
path1 = "#{Rails.root}/app/views/elements/"
|
92
|
-
path2 = "#{Rails.root}/vendor/plugins/alchemy/app/views/elements/"
|
93
|
-
partial_name = "_#{element.name.underscore}_#{part}.html.erb"
|
94
90
|
locals = options.delete(:locals)
|
95
91
|
render(
|
96
92
|
:partial => "alchemy/elements/#{element.name.underscore}_#{part}",
|
@@ -101,14 +97,10 @@ module Alchemy
|
|
101
97
|
}.merge(locals || {})
|
102
98
|
)
|
103
99
|
end
|
104
|
-
rescue ActionView::MissingTemplate
|
100
|
+
rescue ActionView::MissingTemplate => e
|
105
101
|
warning(%(
|
106
102
|
Element #{part} partial not found for #{element.name}.\n
|
107
|
-
|
108
|
-
neither in #{path1}
|
109
|
-
nor in #{path2}
|
110
|
-
Use rails generate alchemy:elements to generate them.
|
111
|
-
Maybe you still have old style partial names? (like .rhtml). Then please rename them in .html.erb'
|
103
|
+
#{e}
|
112
104
|
))
|
113
105
|
render :partial => "alchemy/elements/#{part}_not_found", :locals => {:name => element.name, :error => "Element #{part} partial not found. Use rails generate alchemy:elements to generate them."}
|
114
106
|
end
|
@@ -83,6 +83,7 @@ module Alchemy
|
|
83
83
|
# <%= render_essence_view_by_type(element, 2) %>
|
84
84
|
#
|
85
85
|
def render_essence_view_by_position(element, position, options = {}, html_options = {})
|
86
|
+
ActiveSupport::Deprecation.warn 'Alchemy CMS: render_essence_view_by_position is not supported anymore and will be removed.'
|
86
87
|
if element.blank?
|
87
88
|
warning('Element is nil')
|
88
89
|
return ""
|
@@ -112,12 +112,12 @@ module Alchemy
|
|
112
112
|
|
113
113
|
# Renders the navigation.
|
114
114
|
#
|
115
|
-
# It produces a html <ul><li></li></ul> structure with all necessary classes
|
115
|
+
# It produces a html <ul><li></li></ul> structure with all necessary classes so you can produce every navigation the web uses today.
|
116
116
|
# I.E. dropdown-navigations, simple mainnavigations or even complex nested ones.
|
117
117
|
#
|
118
118
|
# === En detail:
|
119
119
|
#
|
120
|
-
# <ul class="
|
120
|
+
# <ul class="navigation level_1">
|
121
121
|
# <li class="first home"><a href="/home" class="active" title="Homepage" lang="en" data-page-id="1">Homepage</a></li>
|
122
122
|
# <li class="contact"><a href="/contact" title="Contact" lang="en" data-page-id="2">Contact</a></li>
|
123
123
|
# <li class="last imprint"><a href="/imprint" title="Imprint" lang="en" data-page-id="3">Imprint</a></li>
|
@@ -143,7 +143,15 @@ module Alchemy
|
|
143
143
|
# :reverse => false # Reverse the navigation
|
144
144
|
# :reverse_children => false # Reverse the nested children
|
145
145
|
#
|
146
|
-
|
146
|
+
# === Passing HTML classes and ids to the renderer
|
147
|
+
#
|
148
|
+
# A second hash will be passed as html_options to the navigation renderer partial.
|
149
|
+
#
|
150
|
+
# ==== Example:
|
151
|
+
#
|
152
|
+
# <%= render_navigation({from_page => 'subnavi'}, {:class => 'navigation', :id => 'subnavigation'}) %>
|
153
|
+
#
|
154
|
+
def render_navigation(options = {}, html_options = {})
|
147
155
|
default_options = {
|
148
156
|
:submenu => false,
|
149
157
|
:all_sub_menues => false,
|
@@ -179,7 +187,12 @@ module Alchemy
|
|
179
187
|
if options[:reverse]
|
180
188
|
pages.reverse!
|
181
189
|
end
|
182
|
-
render
|
190
|
+
render(
|
191
|
+
options[:navigation_partial],
|
192
|
+
:options => options,
|
193
|
+
:pages => pages,
|
194
|
+
:html_options => html_options
|
195
|
+
)
|
183
196
|
end
|
184
197
|
|
185
198
|
# Renders navigation the children and all siblings of the given page (standard is the current page).
|
@@ -217,6 +230,12 @@ module Alchemy
|
|
217
230
|
@breadcrumb.include?(page)
|
218
231
|
end
|
219
232
|
|
233
|
+
# Returns +'active'+ if the given external page is in the current url path or +nil+.
|
234
|
+
def external_page_css_class(page)
|
235
|
+
return nil if !page.redirects_to_external?
|
236
|
+
request.path.split('/').delete_if(&:blank?).first == page.urlname.gsub(/^\//, '') ? 'active' : nil
|
237
|
+
end
|
238
|
+
|
220
239
|
# Returns page links in a breadcrumb beginning from root to current page.
|
221
240
|
#
|
222
241
|
# === Options:
|
@@ -293,7 +312,7 @@ module Alchemy
|
|
293
312
|
:seperator => ""
|
294
313
|
}
|
295
314
|
default_options.update(options)
|
296
|
-
[default_options[:prefix], @page.title].join(default_options[:seperator])
|
315
|
+
[default_options[:prefix], response.status == 200 ? @page.title : response.status].join(default_options[:seperator])
|
297
316
|
end
|
298
317
|
|
299
318
|
# Returns a complete html <title> tag for the <head> part of the html document.
|
@@ -306,11 +325,10 @@ module Alchemy
|
|
306
325
|
def render_title_tag(options={})
|
307
326
|
default_options = {
|
308
327
|
:prefix => "",
|
309
|
-
:seperator => "
|
328
|
+
:seperator => ""
|
310
329
|
}
|
311
330
|
options = default_options.merge(options)
|
312
|
-
title
|
313
|
-
%(<title>#{title}</title>).html_safe
|
331
|
+
%(<title>#{render_page_title(options)}</title>).html_safe
|
314
332
|
end
|
315
333
|
|
316
334
|
# Renders a html <meta> tag for :name => "" and :content => ""
|
@@ -358,7 +376,7 @@ module Alchemy
|
|
358
376
|
end
|
359
377
|
default_options = {
|
360
378
|
:title_prefix => "",
|
361
|
-
:title_seperator => "
|
379
|
+
:title_seperator => "",
|
362
380
|
:default_lang => "de"
|
363
381
|
}
|
364
382
|
options = default_options.merge(options)
|
@@ -378,15 +396,15 @@ module Alchemy
|
|
378
396
|
meta_string = %(
|
379
397
|
<meta charset="UTF-8">
|
380
398
|
#{render_title_tag(:prefix => options[:title_prefix], :seperator => options[:title_seperator])}
|
381
|
-
|
382
|
-
|
399
|
+
#{render_meta_tag(:name => "description", :content => description)}
|
400
|
+
#{render_meta_tag(:name => "keywords", :content => keywords)}
|
383
401
|
<meta name="created" content="#{@page.updated_at}">
|
384
402
|
<meta name="robots" content="#{robot}">
|
385
403
|
)
|
386
404
|
if @page.contains_feed?
|
387
405
|
meta_string += %(
|
388
|
-
|
389
|
-
|
406
|
+
<link rel="alternate" type="application/rss+xml" title="RSS" href="#{show_alchemy_page_url(@page, :protocol => 'feed', :format => :rss)}">
|
407
|
+
)
|
390
408
|
end
|
391
409
|
return meta_string.html_safe
|
392
410
|
end
|
@@ -6,7 +6,7 @@ module Alchemy
|
|
6
6
|
belongs_to :essence, :polymorphic => true, :dependent => :destroy
|
7
7
|
belongs_to :element
|
8
8
|
|
9
|
-
stampable
|
9
|
+
stampable(:stamper_class_name => 'Alchemy::User')
|
10
10
|
|
11
11
|
acts_as_list
|
12
12
|
|
@@ -55,9 +55,9 @@ module Alchemy
|
|
55
55
|
# Settings from the elements.yml definition
|
56
56
|
def settings
|
57
57
|
return {} if description.blank?
|
58
|
-
settings
|
59
|
-
return {} if settings.blank?
|
60
|
-
settings.symbolize_keys
|
58
|
+
@settings ||= description['settings']
|
59
|
+
return {} if @settings.blank?
|
60
|
+
@settings.symbolize_keys
|
61
61
|
end
|
62
62
|
|
63
63
|
def siblings
|
@@ -104,11 +104,11 @@ module Alchemy
|
|
104
104
|
logger.warn("\n+++++++++++ Warning: Content with id #{self.id} is missing its Element\n")
|
105
105
|
return nil
|
106
106
|
else
|
107
|
-
desc
|
108
|
-
if desc.blank?
|
109
|
-
desc
|
107
|
+
@desc ||= self.element.content_description_for(self.name)
|
108
|
+
if @desc.blank?
|
109
|
+
@desc ||= self.element.available_content_description_for(self.name)
|
110
110
|
else
|
111
|
-
return desc
|
111
|
+
return @desc
|
112
112
|
end
|
113
113
|
end
|
114
114
|
end
|
@@ -13,7 +13,7 @@ module Alchemy
|
|
13
13
|
|
14
14
|
# All Elements inside a cell are a list. All Elements not in cell are in the cell_id.nil list.
|
15
15
|
acts_as_list :scope => [:page_id, :cell_id]
|
16
|
-
stampable
|
16
|
+
stampable(:stamper_class_name => 'Alchemy::User')
|
17
17
|
|
18
18
|
has_many :contents, :order => :position, :dependent => :destroy
|
19
19
|
belongs_to :cell
|
@@ -121,22 +121,26 @@ module Alchemy
|
|
121
121
|
contents.find_by_name(rss_title['name'])
|
122
122
|
end
|
123
123
|
|
124
|
-
#
|
124
|
+
# Builds a new element as described in +/config/alchemy/elements.yml+
|
125
125
|
def self.new_from_scratch(attributes)
|
126
126
|
attributes.stringify_keys!
|
127
127
|
return Element.new if attributes['name'].blank?
|
128
128
|
element_descriptions = Element.descriptions
|
129
129
|
return if element_descriptions.blank?
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
130
|
+
element_name = attributes['name'].split('#').first
|
131
|
+
element_scratch = element_descriptions.detect { |m| m["name"] == element_name }
|
132
|
+
if element_scratch
|
133
|
+
Element.new(
|
134
|
+
element_scratch.except('contents', 'available_contents', 'display_name', 'amount').merge({
|
135
|
+
:page_id => attributes['page_id']
|
136
|
+
})
|
137
|
+
)
|
138
|
+
else
|
139
|
+
raise "Element description for #{element_name} not found. Please check your elements.yml"
|
140
|
+
end
|
137
141
|
end
|
138
142
|
|
139
|
-
#
|
143
|
+
# Builds a new element as described in +/config/alchemy/elements.yml+ and saves it
|
140
144
|
def self.create_from_scratch(attributes)
|
141
145
|
element = Element.new_from_scratch(attributes)
|
142
146
|
element.save if element
|
@@ -1,13 +1,13 @@
|
|
1
1
|
# This is a tableless model only used for validating contactform fields.
|
2
|
-
#
|
2
|
+
#
|
3
3
|
# You can specify the fields for your contactform in the +config/alchemy/config.yml+ file in the +:mailer+ options.
|
4
|
-
#
|
4
|
+
#
|
5
5
|
# === Example Contactform Configuration:
|
6
|
-
#
|
7
|
-
#
|
8
|
-
#
|
9
|
-
#
|
10
|
-
#
|
6
|
+
#
|
7
|
+
# mailer:
|
8
|
+
# form_layout_name: contact
|
9
|
+
# fields: [subject, name, email, message, info]
|
10
|
+
# validate_fields: [name, email]
|
11
11
|
|
12
12
|
module Alchemy
|
13
13
|
class Message
|
@@ -22,12 +22,12 @@ module Alchemy
|
|
22
22
|
attr_accessor :contact_form_id, :ip
|
23
23
|
attr_accessible :contact_form_id
|
24
24
|
|
25
|
-
@@config[
|
25
|
+
@@config['fields'].each do |field|
|
26
26
|
attr_accessor field.to_sym
|
27
27
|
attr_accessible field.to_sym
|
28
28
|
end
|
29
29
|
|
30
|
-
@@config[
|
30
|
+
@@config['validate_fields'].each do |field|
|
31
31
|
validates_presence_of field
|
32
32
|
if field.to_s == 'email'
|
33
33
|
validates_format_of field, :with => ::Authlogic::Regex.email, :if => :email_is_filled
|
data/app/models/alchemy/page.rb
CHANGED
@@ -30,7 +30,7 @@ module Alchemy
|
|
30
30
|
RESERVED_URLNAMES = %w(admin messages)
|
31
31
|
|
32
32
|
acts_as_nested_set(:dependent => :destroy)
|
33
|
-
stampable
|
33
|
+
stampable(:stamper_class_name => 'Alchemy::User')
|
34
34
|
|
35
35
|
has_many :folded_pages
|
36
36
|
has_many :cells, :dependent => :destroy
|
@@ -64,7 +64,7 @@ module Alchemy
|
|
64
64
|
scope :not_locked, where(:locked => false)
|
65
65
|
scope :visible, where(:visible => true)
|
66
66
|
scope :published, where(:public => true)
|
67
|
-
scope :
|
67
|
+
scope :accessible, where(:restricted => false)
|
68
68
|
scope :restricted, where(:restricted => true)
|
69
69
|
scope :not_restricted, where(:restricted => false)
|
70
70
|
scope :public_language_roots, lambda {
|
@@ -107,6 +107,7 @@ module Alchemy
|
|
107
107
|
elsif !options[:except].blank?
|
108
108
|
elements = elements.excluded(options[:except])
|
109
109
|
end
|
110
|
+
elements = elements.reverse_order if options[:reverse_sort] || options[:reverse]
|
110
111
|
elements = elements.offset(options[:offset]).limit(options[:count])
|
111
112
|
elements = elements.order("RAND()") if options[:random]
|
112
113
|
if show_non_public
|
@@ -260,7 +261,7 @@ module Alchemy
|
|
260
261
|
|
261
262
|
def fold(user_id, status)
|
262
263
|
folded_page = FoldedPage.find_or_create_by_user_id_and_page_id(user_id, self.id)
|
263
|
-
folded_page.
|
264
|
+
folded_page.folded = status
|
264
265
|
folded_page.save
|
265
266
|
end
|
266
267
|
|