Description:
wip: bootstrap toggle switch todo: add javascript that thisable button until reponse arrived
Commit status:
[Not Reviewed]
References:
Comments:
0 Commit comments 0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
Add another comment

r556:b4cf182747cd - - 9 files changed: 23 inserted, 4 deleted

@@ -33,39 +33,40
33 # gem 'unicorn'
33 # gem 'unicorn'
34
34
35 # Deploy with Capistrano
35 # Deploy with Capistrano
36 # gem 'capistrano'
36 # gem 'capistrano'
37
37
38 # To use debugger
38 # To use debugger
39 # gem 'debugger'
39 # gem 'debugger'
40 #
40 #
41
41
42 #in-place editor
42 #in-place editor
43 gem 'best_in_place', '~> 3.0.1'
43 gem 'best_in_place', '~> 3.0.1'
44
44
45 # jquery addition
45 # jquery addition
46 gem 'jquery-rails'
46 gem 'jquery-rails'
47 gem 'jquery-ui-sass-rails'
47 gem 'jquery-ui-sass-rails'
48 gem 'jquery-timepicker-addon-rails'
48 gem 'jquery-timepicker-addon-rails'
49 gem 'jquery-tablesorter'
49 gem 'jquery-tablesorter'
50
50
51 #syntax highlighter
51 #syntax highlighter
52 gem 'rouge'
52 gem 'rouge'
53
53
54 #add bootstrap
54 #add bootstrap
55 gem 'bootstrap-sass', '~> 3.2.0'
55 gem 'bootstrap-sass', '~> 3.2.0'
56 gem 'bootstrap-switch-rails'
56 gem 'bootstrap-switch-rails'
57 + gem 'bootstrap-toggle-rails'
57 gem 'autoprefixer-rails'
58 gem 'autoprefixer-rails'
58
59
59
60
60 gem 'haml'
61 gem 'haml'
61 gem 'mail'
62 gem 'mail'
62 gem 'rdiscount'
63 gem 'rdiscount'
63 gem 'test-unit'
64 gem 'test-unit'
64 gem 'will_paginate', '~> 3.0.7'
65 gem 'will_paginate', '~> 3.0.7'
65 gem 'dynamic_form'
66 gem 'dynamic_form'
66 gem 'in_place_editing'
67 gem 'in_place_editing'
67 gem 'verification', :git => 'https://github.com/sikachu/verification.git'
68 gem 'verification', :git => 'https://github.com/sikachu/verification.git'
68
69
69 group :test, :development do
70 group :test, :development do
70 gem 'rspec-rails', '~> 2.99.0'
71 gem 'rspec-rails', '~> 2.99.0'
71 end
72 end
@@ -25,48 +25,49
25 activemodel (3.2.21)
25 activemodel (3.2.21)
26 activesupport (= 3.2.21)
26 activesupport (= 3.2.21)
27 builder (~> 3.0.0)
27 builder (~> 3.0.0)
28 activerecord (3.2.21)
28 activerecord (3.2.21)
29 activemodel (= 3.2.21)
29 activemodel (= 3.2.21)
30 activesupport (= 3.2.21)
30 activesupport (= 3.2.21)
31 arel (~> 3.0.2)
31 arel (~> 3.0.2)
32 tzinfo (~> 0.3.29)
32 tzinfo (~> 0.3.29)
33 activeresource (3.2.21)
33 activeresource (3.2.21)
34 activemodel (= 3.2.21)
34 activemodel (= 3.2.21)
35 activesupport (= 3.2.21)
35 activesupport (= 3.2.21)
36 activesupport (3.2.21)
36 activesupport (3.2.21)
37 i18n (~> 0.6, >= 0.6.4)
37 i18n (~> 0.6, >= 0.6.4)
38 multi_json (~> 1.0)
38 multi_json (~> 1.0)
39 arel (3.0.3)
39 arel (3.0.3)
40 autoprefixer-rails (6.0.3)
40 autoprefixer-rails (6.0.3)
41 execjs
41 execjs
42 json
42 json
43 best_in_place (3.0.3)
43 best_in_place (3.0.3)
44 actionpack (>= 3.2)
44 actionpack (>= 3.2)
45 railties (>= 3.2)
45 railties (>= 3.2)
46 bootstrap-sass (3.2.0.2)
46 bootstrap-sass (3.2.0.2)
47 sass (~> 3.2)
47 sass (~> 3.2)
48 bootstrap-switch-rails (3.3.3)
48 bootstrap-switch-rails (3.3.3)
49 + bootstrap-toggle-rails (2.2.1.0)
49 builder (3.0.4)
50 builder (3.0.4)
50 coffee-rails (3.2.2)
51 coffee-rails (3.2.2)
51 coffee-script (>= 2.2.0)
52 coffee-script (>= 2.2.0)
52 railties (~> 3.2.0)
53 railties (~> 3.2.0)
53 coffee-script (2.3.0)
54 coffee-script (2.3.0)
54 coffee-script-source
55 coffee-script-source
55 execjs
56 execjs
56 coffee-script-source (1.9.0)
57 coffee-script-source (1.9.0)
57 diff-lcs (1.2.5)
58 diff-lcs (1.2.5)
58 dynamic_form (1.1.4)
59 dynamic_form (1.1.4)
59 erubis (2.7.0)
60 erubis (2.7.0)
60 execjs (2.3.0)
61 execjs (2.3.0)
61 haml (4.0.6)
62 haml (4.0.6)
62 tilt
63 tilt
63 hike (1.2.3)
64 hike (1.2.3)
64 i18n (0.7.0)
65 i18n (0.7.0)
65 in_place_editing (1.2.0)
66 in_place_editing (1.2.0)
66 journey (1.0.4)
67 journey (1.0.4)
67 jquery-rails (3.1.2)
68 jquery-rails (3.1.2)
68 railties (>= 3.0, < 5.0)
69 railties (>= 3.0, < 5.0)
69 thor (>= 0.14, < 2.0)
70 thor (>= 0.14, < 2.0)
70 jquery-tablesorter (1.13.4)
71 jquery-tablesorter (1.13.4)
71 railties (>= 3.1, < 5)
72 railties (>= 3.1, < 5)
72 jquery-timepicker-addon-rails (1.4.1)
73 jquery-timepicker-addon-rails (1.4.1)
@@ -143,45 +144,46
143 multi_json (~> 1.0)
144 multi_json (~> 1.0)
144 rack (~> 1.0)
145 rack (~> 1.0)
145 tilt (~> 1.1, != 1.3.0)
146 tilt (~> 1.1, != 1.3.0)
146 test-unit (3.0.9)
147 test-unit (3.0.9)
147 power_assert
148 power_assert
148 thor (0.19.1)
149 thor (0.19.1)
149 tilt (1.4.1)
150 tilt (1.4.1)
150 treetop (1.4.15)
151 treetop (1.4.15)
151 polyglot
152 polyglot
152 polyglot (>= 0.3.1)
153 polyglot (>= 0.3.1)
153 tzinfo (0.3.43)
154 tzinfo (0.3.43)
154 uglifier (2.7.0)
155 uglifier (2.7.0)
155 execjs (>= 0.3.0)
156 execjs (>= 0.3.0)
156 json (>= 1.8.0)
157 json (>= 1.8.0)
157 will_paginate (3.0.7)
158 will_paginate (3.0.7)
158
159
159 PLATFORMS
160 PLATFORMS
160 ruby
161 ruby
161
162
162 DEPENDENCIES
163 DEPENDENCIES
163 autoprefixer-rails
164 autoprefixer-rails
164 best_in_place (~> 3.0.1)
165 best_in_place (~> 3.0.1)
165 bootstrap-sass (~> 3.2.0)
166 bootstrap-sass (~> 3.2.0)
166 bootstrap-switch-rails
167 bootstrap-switch-rails
168 + bootstrap-toggle-rails
167 coffee-rails (~> 3.2.2)
169 coffee-rails (~> 3.2.2)
168 dynamic_form
170 dynamic_form
169 haml
171 haml
170 in_place_editing
172 in_place_editing
171 jquery-rails
173 jquery-rails
172 jquery-tablesorter
174 jquery-tablesorter
173 jquery-timepicker-addon-rails
175 jquery-timepicker-addon-rails
174 jquery-ui-sass-rails
176 jquery-ui-sass-rails
175 mail
177 mail
176 mysql2
178 mysql2
177 prototype-rails
179 prototype-rails
178 rails (= 3.2.21)
180 rails (= 3.2.21)
179 rdiscount
181 rdiscount
180 rouge
182 rouge
181 rspec-rails (~> 2.99.0)
183 rspec-rails (~> 2.99.0)
182 sass-rails (~> 3.2.6)
184 sass-rails (~> 3.2.6)
183 select2-rails
185 select2-rails
184 test-unit
186 test-unit
185 uglifier
187 uglifier
186 verification!
188 verification!
187 will_paginate (~> 3.0.7)
189 will_paginate (~> 3.0.7)
@@ -1,27 +1,28
1 // This is a manifest file that'll be compiled into application.js, which will include all the files
1 // This is a manifest file that'll be compiled into application.js, which will include all the files
2 // listed below.
2 // listed below.
3 //
3 //
4 // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
4 // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
5 // or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
5 // or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
6 //
6 //
7 // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
7 // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
8 // the compiled file.
8 // the compiled file.
9 //
9 //
10 // WARNING: THE FIRST BLANK LINE MARKS THE END OF WHAT'S TO BE PROCESSED, ANY BLANK LINE SHOULD
10 // WARNING: THE FIRST BLANK LINE MARKS THE END OF WHAT'S TO BE PROCESSED, ANY BLANK LINE SHOULD
11 // GO AFTER THE REQUIRES BELOW.
11 // GO AFTER THE REQUIRES BELOW.
12 //
12 //
13 //= require jquery
13 //= require jquery
14 //= require jquery_ujs
14 //= require jquery_ujs
15 //= require jquery.ui.all
15 //= require jquery.ui.all
16 //= require bootstrap-sprockets
16 //= require bootstrap-sprockets
17 - //= require bootstrap-switch
17 + //x= require bootstrap-switch
18 + //= require bootstrap-toggle
18 //= require select2
19 //= require select2
19 //= require custom
20 //= require custom
20
21
21
22
22 // since this is after blank line, it is not downloaded
23 // since this is after blank line, it is not downloaded
23 //x= require prototype
24 //x= require prototype
24 //x= require prototype_ujs
25 //x= require prototype_ujs
25 //x= require effects
26 //x= require effects
26 //x= require dragdrop
27 //x= require dragdrop
27 //x= require controls
28 //x= require controls
@@ -1,26 +1,27
1 $(document).on 'change', '.btn-file :file', ->
1 $(document).on 'change', '.btn-file :file', ->
2 input = $(this)
2 input = $(this)
3 numFiles = if input.get(0).files then input.get(0).files.length else 1
3 numFiles = if input.get(0).files then input.get(0).files.length else 1
4 label = input.val().replace(/\\/g, '/').replace(/.*\//, '')
4 label = input.val().replace(/\\/g, '/').replace(/.*\//, '')
5 input.trigger 'fileselect', [
5 input.trigger 'fileselect', [
6 numFiles
6 numFiles
7 label
7 label
8 ]
8 ]
9 return
9 return
10
10
11
11
12 # document ready
12 # document ready
13
13
14 $ ->
14 $ ->
15 $(".select2").select2()
15 $(".select2").select2()
16 - $(".bootstrap-switch").bootstrapSwitch()
16 + #$(".bootstrap-switch").bootstrapSwitch()
17 + $(".bootstrap-toggle").bootstrapToggle()
17 $('.btn-file :file').on 'fileselect', (event, numFiles, label) ->
18 $('.btn-file :file').on 'fileselect', (event, numFiles, label) ->
18 input = $(this).parents('.input-group').find(':text')
19 input = $(this).parents('.input-group').find(':text')
19 log = if numFiles > 1 then numFiles + ' files selected' else label
20 log = if numFiles > 1 then numFiles + ' files selected' else label
20 if input.length
21 if input.length
21 input.val log
22 input.val log
22 else
23 else
23 if log
24 if log
24 alert log
25 alert log
25 return
26 return
26 return
27 return
@@ -9,49 +9,50
9 * compiled file so the styles you add here take precedence over styles defined in any styles
9 * compiled file so the styles you add here take precedence over styles defined in any styles
10 * defined in the other CSS/SCSS files in this directory. It is generally better to create a new
10 * defined in the other CSS/SCSS files in this directory. It is generally better to create a new
11 * file per style scope.
11 * file per style scope.
12 *
12 *
13 // bootstrap says that we should not do this, but @import each file instead
13 // bootstrap says that we should not do this, but @import each file instead
14 # *= require_tree .
14 # *= require_tree .
15 # *= require_self
15 # *= require_self
16 */
16 */
17
17
18 @import jquery.ui.all
18 @import jquery.ui.all
19 @import jquery.ui.core
19 @import jquery.ui.core
20 @import jquery.ui.core
20 @import jquery.ui.core
21 @import jquery.ui.theme
21 @import jquery.ui.theme
22 @import jquery.ui.datepicker
22 @import jquery.ui.datepicker
23 @import jquery.ui.slider
23 @import jquery.ui.slider
24 @import jquery-ui-timepicker-addon
24 @import jquery-ui-timepicker-addon
25 @import jquery-tablesorter/theme.metro-dark
25 @import jquery-tablesorter/theme.metro-dark
26 @import tablesorter-theme.cafe
26 @import tablesorter-theme.cafe
27
27
28 //bootstrap
28 //bootstrap
29 @import bootstrap-sprockets
29 @import bootstrap-sprockets
30 @import bootstrap
30 @import bootstrap
31 @import select2
31 @import select2
32 @import select2-bootstrap
32 @import select2-bootstrap
33 - @import bootstrap3-switch
33 + //@import bootstrap3-switch
34 + @import bootstrap-toggle
34
35
35 .secondnavbar
36 .secondnavbar
36 top: 50px
37 top: 50px
37
38
38 .btn-file
39 .btn-file
39 position: relative
40 position: relative
40 overflow: hidden
41 overflow: hidden
41
42
42 .btn-file input[type=file]
43 .btn-file input[type=file]
43 position: absolute
44 position: absolute
44 top: 0
45 top: 0
45 right: 0
46 right: 0
46 min-width: 100%
47 min-width: 100%
47 min-height: 100%
48 min-height: 100%
48 font-size: 100px
49 font-size: 100px
49 text-align: right
50 text-align: right
50 filter: alpha(opacity=0)
51 filter: alpha(opacity=0)
51 opacity: 0
52 opacity: 0
52 outline: none
53 outline: none
53 background: white
54 background: white
54 cursor: inherit
55 cursor: inherit
55 display: block
56 display: block
56
57
57 body
58 body
@@ -48,44 +48,54
48 def create
48 def create
49 @announcement = Announcement.new(params[:announcement])
49 @announcement = Announcement.new(params[:announcement])
50
50
51 respond_to do |format|
51 respond_to do |format|
52 if @announcement.save
52 if @announcement.save
53 flash[:notice] = 'Announcement was successfully created.'
53 flash[:notice] = 'Announcement was successfully created.'
54 format.html { redirect_to(@announcement) }
54 format.html { redirect_to(@announcement) }
55 format.xml { render :xml => @announcement, :status => :created, :location => @announcement }
55 format.xml { render :xml => @announcement, :status => :created, :location => @announcement }
56 else
56 else
57 format.html { render :action => "new" }
57 format.html { render :action => "new" }
58 format.xml { render :xml => @announcement.errors, :status => :unprocessable_entity }
58 format.xml { render :xml => @announcement.errors, :status => :unprocessable_entity }
59 end
59 end
60 end
60 end
61 end
61 end
62
62
63 # PUT /announcements/1
63 # PUT /announcements/1
64 # PUT /announcements/1.xml
64 # PUT /announcements/1.xml
65 def update
65 def update
66 @announcement = Announcement.find(params[:id])
66 @announcement = Announcement.find(params[:id])
67
67
68 respond_to do |format|
68 respond_to do |format|
69 if @announcement.update_attributes(params[:announcement])
69 if @announcement.update_attributes(params[:announcement])
70 flash[:notice] = 'Announcement was successfully updated.'
70 flash[:notice] = 'Announcement was successfully updated.'
71 format.html { redirect_to(@announcement) }
71 format.html { redirect_to(@announcement) }
72 + format.js {}
72 format.xml { head :ok }
73 format.xml { head :ok }
73 else
74 else
74 format.html { render :action => "edit" }
75 format.html { render :action => "edit" }
76 + format.js {}
75 format.xml { render :xml => @announcement.errors, :status => :unprocessable_entity }
77 format.xml { render :xml => @announcement.errors, :status => :unprocessable_entity }
76 end
78 end
77 end
79 end
78 end
80 end
79
81
82 + def toggle
83 + @announcement = Announcement.find(params[:id])
84 + @announcement.update_attributes( published: params[:published] == 1)
85 + respond_to do |format|
86 + format.js {}
87 + end
88 + end
89 +
80 # DELETE /announcements/1
90 # DELETE /announcements/1
81 # DELETE /announcements/1.xml
91 # DELETE /announcements/1.xml
82 def destroy
92 def destroy
83 @announcement = Announcement.find(params[:id])
93 @announcement = Announcement.find(params[:id])
84 @announcement.destroy
94 @announcement.destroy
85
95
86 respond_to do |format|
96 respond_to do |format|
87 format.html { redirect_to(announcements_url) }
97 format.html { redirect_to(announcements_url) }
88 format.xml { head :ok }
98 format.xml { head :ok }
89 end
99 end
90 end
100 end
91 end
101 end
@@ -1,34 +1,35
1 class ApplicationController < ActionController::Base
1 class ApplicationController < ActionController::Base
2 protect_from_forgery
2 protect_from_forgery
3
3
4 before_filter :current_user
4 before_filter :current_user
5
5
6 SINGLE_USER_MODE_CONF_KEY = 'system.single_user_mode'
6 SINGLE_USER_MODE_CONF_KEY = 'system.single_user_mode'
7 MULTIPLE_IP_LOGIN_CONF_KEY = 'right.multiple_ip_login'
7 MULTIPLE_IP_LOGIN_CONF_KEY = 'right.multiple_ip_login'
8
8
9 # Returns the current logged-in user (if any).
9 # Returns the current logged-in user (if any).
10 def current_user
10 def current_user
11 + return nil unless session[:user_id]
11 @current_user ||= User.find(session[:user_id])
12 @current_user ||= User.find(session[:user_id])
12 end
13 end
13
14
14 def admin_authorization
15 def admin_authorization
15 return false unless authenticate
16 return false unless authenticate
16 user = User.find(session[:user_id], :include => ['roles'])
17 user = User.find(session[:user_id], :include => ['roles'])
17 unless user.admin?
18 unless user.admin?
18 flash[:notice] = 'You are not authorized to view the page you requested'
19 flash[:notice] = 'You are not authorized to view the page you requested'
19 redirect_to :controller => 'main', :action => 'login' unless user.admin?
20 redirect_to :controller => 'main', :action => 'login' unless user.admin?
20 return false
21 return false
21 end
22 end
22 return true
23 return true
23 end
24 end
24
25
25 def authorization_by_roles(allowed_roles)
26 def authorization_by_roles(allowed_roles)
26 return false unless authenticate
27 return false unless authenticate
27 user = User.find(session[:user_id])
28 user = User.find(session[:user_id])
28 unless user.roles.detect { |role| allowed_roles.member?(role.name) }
29 unless user.roles.detect { |role| allowed_roles.member?(role.name) }
29 flash[:notice] = 'You are not authorized to view the page you requested'
30 flash[:notice] = 'You are not authorized to view the page you requested'
30 redirect_to :controller => 'main', :action => 'login'
31 redirect_to :controller => 'main', :action => 'login'
31 return false
32 return false
32 end
33 end
33 end
34 end
34
35
@@ -6,36 +6,36
6 <tr class="info-head">
6 <tr class="info-head">
7 <th>Updated</th>
7 <th>Updated</th>
8 <th>Announcement</th>
8 <th>Announcement</th>
9 <th>Author</th>
9 <th>Author</th>
10 <th>Published</th>
10 <th>Published</th>
11 <th></th>
11 <th></th>
12 <th></th>
12 <th></th>
13 <th></th>
13 <th></th>
14 </tr>
14 </tr>
15
15
16 <% for announcement in @announcements %>
16 <% for announcement in @announcements %>
17 <tr class="info-<%= cycle 'odd', 'even' %>">
17 <tr class="info-<%= cycle 'odd', 'even' %>">
18 <% @announcement = announcement %>
18 <% @announcement = announcement %>
19 <td><%= time_ago_in_words announcement.updated_at %></td>
19 <td><%= time_ago_in_words announcement.updated_at %></td>
20 <td>
20 <td>
21 <% if !announcement.title.blank? %>
21 <% if !announcement.title.blank? %>
22 <b>Title:</b> <%=h announcement.title %><br/>
22 <b>Title:</b> <%=h announcement.title %><br/>
23 <% end %>
23 <% end %>
24 <% if !announcement.notes.blank? %>
24 <% if !announcement.notes.blank? %>
25 <b>Notes: <%=h announcement.notes %></b><br/>
25 <b>Notes: <%=h announcement.notes %></b><br/>
26 <% end %>
26 <% end %>
27 <%=h announcement.body %>
27 <%=h announcement.body %>
28 </td>
28 </td>
29 <td><%=h announcement.author %></td>
29 <td><%=h announcement.author %></td>
30 - <td><%= check_box_tag :published, 1, announcement.published, class: 'bootstrap-switch', data: {size: 'small'} %></td>
30 + <td><%= check_box_tag :published, 1, announcement.published, { class: 'bootstrap-toggle', id: "published-#{announcement.id}", data: {remote: true, method: 'PUT', url: url_for(controller: :announcements, action: :toggle, id: announcement), size: 'small', toggle: 'toggle' } } %></td>
31 <!-- <td><%= in_place_editor_field :announcement, :published, {}, :rows => 1 %></td> -->
31 <!-- <td><%= in_place_editor_field :announcement, :published, {}, :rows => 1 %></td> -->
32 <td><%= link_to 'Show', announcement %></td>
32 <td><%= link_to 'Show', announcement %></td>
33 <td><%= link_to 'Edit', edit_announcement_path(announcement) %></td>
33 <td><%= link_to 'Edit', edit_announcement_path(announcement) %></td>
34 <td><%= link_to 'Destroy', announcement, :confirm => 'Are you sure?', :method => :delete %></td>
34 <td><%= link_to 'Destroy', announcement, :confirm => 'Are you sure?', :method => :delete %></td>
35 </tr>
35 </tr>
36 <% end %>
36 <% end %>
37 </table>
37 </table>
38
38
39 <br />
39 <br />
40
40
41 <%= link_to 'New announcement', new_announcement_path %>
41 <%= link_to 'New announcement', new_announcement_path %>
@@ -1,25 +1,27
1 CafeGrader::Application.routes.draw do
1 CafeGrader::Application.routes.draw do
2 root :to => 'main#login'
2 root :to => 'main#login'
3
3
4 get "report/login"
4 get "report/login"
5
5
6 resources :contests
6 resources :contests
7
7
8 resources :announcements
8 resources :announcements
9 + match 'announcements/toggle/:id' => 'announcements#toggle', via: :put
10 +
9 resources :sites
11 resources :sites
10
12
11 resources :grader_configuration, controller: 'configurations'
13 resources :grader_configuration, controller: 'configurations'
12
14
13 match 'tasks/view/:file.:ext' => 'tasks#view'
15 match 'tasks/view/:file.:ext' => 'tasks#view'
14 match 'tasks/download/:id/:file.:ext' => 'tasks#download'
16 match 'tasks/download/:id/:file.:ext' => 'tasks#download'
15 match 'heartbeat/:id/edit' => 'heartbeat#edit'
17 match 'heartbeat/:id/edit' => 'heartbeat#edit'
16
18
17 #main
19 #main
18 get "main/list"
20 get "main/list"
19
21
20 # See how all your routes lay out with "rake routes"
22 # See how all your routes lay out with "rake routes"
21
23
22 # This is a legacy wild controller route that's not recommended for RESTful applications.
24 # This is a legacy wild controller route that's not recommended for RESTful applications.
23 # Note: This route will make all actions in every controller accessible via GET requests.
25 # Note: This route will make all actions in every controller accessible via GET requests.
24 match ':controller(/:action(/:id))(.:format)'
26 match ':controller(/:action(/:id))(.:format)'
25 end
27 end
You need to be logged in to leave comments. Login now