fingerrails 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +3 -0
- data/README.rdoc +3 -0
- data/Rakefile +28 -0
- data/VERSION +1 -0
- data/bin/fingerrails +9 -0
- data/fingerrails.gemspec +90 -0
- data/fingertips.rb +181 -0
- data/templates/.kick +22 -0
- data/templates/Rakefile +23 -0
- data/templates/app/controllers/application_controller.rb +51 -0
- data/templates/app/controllers/members_controller.rb +32 -0
- data/templates/app/controllers/passwords_controller.rb +46 -0
- data/templates/app/controllers/sessions_controller.rb +26 -0
- data/templates/app/helpers/application_helper.rb +20 -0
- data/templates/app/models/mailer.rb +8 -0
- data/templates/app/models/member.rb +10 -0
- data/templates/app/models/member/authentication.rb +44 -0
- data/templates/app/views/layouts/_application_javascript_includes.html.erb +3 -0
- data/templates/app/views/layouts/_head.html.erb +3 -0
- data/templates/app/views/layouts/application.html.erb +25 -0
- data/templates/app/views/mailer/reset_password_message.erb +8 -0
- data/templates/app/views/members/edit.html.erb +21 -0
- data/templates/app/views/members/new.html.erb +26 -0
- data/templates/app/views/members/show.html.erb +3 -0
- data/templates/app/views/passwords/edit.html.erb +22 -0
- data/templates/app/views/passwords/new.html.erb +22 -0
- data/templates/app/views/passwords/reset.html.erb +9 -0
- data/templates/app/views/passwords/sent.html.erb +11 -0
- data/templates/app/views/sessions/_form.html.erb +22 -0
- data/templates/app/views/sessions/_status.html.erb +9 -0
- data/templates/app/views/sessions/new.html.erb +5 -0
- data/templates/config/database.yml +18 -0
- data/templates/lib/active_record_ext.rb +26 -0
- data/templates/lib/token.rb +9 -0
- data/templates/public/403.html +29 -0
- data/templates/public/javascripts/ready.js +9 -0
- data/templates/public/stylesheets/default.css +143 -0
- data/templates/public/stylesheets/reset.css +52 -0
- data/templates/test/ext/authentication.rb +24 -0
- data/templates/test/ext/file_fixtures.rb +8 -0
- data/templates/test/ext/time.rb +8 -0
- data/templates/test/fixtures/members.yml +8 -0
- data/templates/test/functional/application_controller_test.rb +104 -0
- data/templates/test/functional/members_controller_test.rb +71 -0
- data/templates/test/functional/passwords_controller_test.rb +95 -0
- data/templates/test/functional/sessions_controller_test.rb +68 -0
- data/templates/test/lib/active_record_ext_test.rb +13 -0
- data/templates/test/lib/token_test.rb +17 -0
- data/templates/test/test_helper.rb +32 -0
- data/templates/test/unit/helpers/application_helper_test.rb +44 -0
- data/templates/test/unit/mailer_test.rb +13 -0
- data/templates/test/unit/member/authentication_test.rb +73 -0
- data/templates/test/unit/member_test.rb +32 -0
- metadata +108 -0
data/.gitignore
ADDED
data/README.rdoc
ADDED
data/Rakefile
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
begin
|
2
|
+
require 'jeweler'
|
3
|
+
Jeweler::Tasks.new do |s|
|
4
|
+
s.name = "fingerrails"
|
5
|
+
s.summary = s.description = "A self contained version of the Fingertips Rails template"
|
6
|
+
s.email = "eloy@fngtps.com"
|
7
|
+
s.homepage = "http://github.com/Fingertips/rails-template"
|
8
|
+
s.authors = ["Manfred Stienstra", "Eloy Duran"]
|
9
|
+
|
10
|
+
s.require_paths = ['bin']
|
11
|
+
end
|
12
|
+
rescue LoadError
|
13
|
+
end
|
14
|
+
|
15
|
+
desc 'Drops the databases and removes the test app.'
|
16
|
+
task :clean do
|
17
|
+
if File.exist? 'test_app'
|
18
|
+
sh 'cd test_app && rake db:drop:all' rescue nil
|
19
|
+
rm_rf 'test_app'
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
desc 'Runs the template with the proper env so that it caches the rails checkout.'
|
24
|
+
task :test_template => :clean do
|
25
|
+
sh 'env TEST_TEMPLATE=true ruby ./bin/fingerrails test_app'
|
26
|
+
end
|
27
|
+
|
28
|
+
task :default => :test_template
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.1.0
|
data/bin/fingerrails
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
if ARGV.empty?
|
4
|
+
puts "Usage: #{$0} /path/to/your/app [options]"
|
5
|
+
else
|
6
|
+
ENV['TEMPLATE_HOME'] = File.expand_path('../../templates', __FILE__)
|
7
|
+
template = File.expand_path('../../fingertips.rb', __FILE__)
|
8
|
+
exec 'rails', '-m', template, *ARGV
|
9
|
+
end
|
data/fingerrails.gemspec
ADDED
@@ -0,0 +1,90 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run `rake gemspec`
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{fingerrails}
|
8
|
+
s.version = "0.1.0"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Manfred Stienstra", "Eloy Duran"]
|
12
|
+
s.date = %q{2009-10-28}
|
13
|
+
s.default_executable = %q{fingerrails}
|
14
|
+
s.description = %q{A self contained version of the Fingertips Rails template}
|
15
|
+
s.email = %q{eloy@fngtps.com}
|
16
|
+
s.executables = ["fingerrails"]
|
17
|
+
s.extra_rdoc_files = [
|
18
|
+
"README.rdoc"
|
19
|
+
]
|
20
|
+
s.files = [
|
21
|
+
".gitignore",
|
22
|
+
"README.rdoc",
|
23
|
+
"Rakefile",
|
24
|
+
"VERSION",
|
25
|
+
"bin/fingerrails",
|
26
|
+
"fingerrails.gemspec",
|
27
|
+
"fingertips.rb",
|
28
|
+
"templates/.kick",
|
29
|
+
"templates/Rakefile",
|
30
|
+
"templates/app/controllers/application_controller.rb",
|
31
|
+
"templates/app/controllers/members_controller.rb",
|
32
|
+
"templates/app/controllers/passwords_controller.rb",
|
33
|
+
"templates/app/controllers/sessions_controller.rb",
|
34
|
+
"templates/app/helpers/application_helper.rb",
|
35
|
+
"templates/app/models/mailer.rb",
|
36
|
+
"templates/app/models/member.rb",
|
37
|
+
"templates/app/models/member/authentication.rb",
|
38
|
+
"templates/app/views/layouts/_application_javascript_includes.html.erb",
|
39
|
+
"templates/app/views/layouts/_head.html.erb",
|
40
|
+
"templates/app/views/layouts/application.html.erb",
|
41
|
+
"templates/app/views/mailer/reset_password_message.erb",
|
42
|
+
"templates/app/views/members/edit.html.erb",
|
43
|
+
"templates/app/views/members/new.html.erb",
|
44
|
+
"templates/app/views/members/show.html.erb",
|
45
|
+
"templates/app/views/passwords/edit.html.erb",
|
46
|
+
"templates/app/views/passwords/new.html.erb",
|
47
|
+
"templates/app/views/passwords/reset.html.erb",
|
48
|
+
"templates/app/views/passwords/sent.html.erb",
|
49
|
+
"templates/app/views/sessions/_form.html.erb",
|
50
|
+
"templates/app/views/sessions/_status.html.erb",
|
51
|
+
"templates/app/views/sessions/new.html.erb",
|
52
|
+
"templates/config/database.yml",
|
53
|
+
"templates/lib/active_record_ext.rb",
|
54
|
+
"templates/lib/token.rb",
|
55
|
+
"templates/public/403.html",
|
56
|
+
"templates/public/javascripts/ready.js",
|
57
|
+
"templates/public/stylesheets/default.css",
|
58
|
+
"templates/public/stylesheets/reset.css",
|
59
|
+
"templates/test/ext/authentication.rb",
|
60
|
+
"templates/test/ext/file_fixtures.rb",
|
61
|
+
"templates/test/ext/time.rb",
|
62
|
+
"templates/test/fixtures/members.yml",
|
63
|
+
"templates/test/functional/application_controller_test.rb",
|
64
|
+
"templates/test/functional/members_controller_test.rb",
|
65
|
+
"templates/test/functional/passwords_controller_test.rb",
|
66
|
+
"templates/test/functional/sessions_controller_test.rb",
|
67
|
+
"templates/test/lib/active_record_ext_test.rb",
|
68
|
+
"templates/test/lib/token_test.rb",
|
69
|
+
"templates/test/test_helper.rb",
|
70
|
+
"templates/test/unit/helpers/application_helper_test.rb",
|
71
|
+
"templates/test/unit/mailer_test.rb",
|
72
|
+
"templates/test/unit/member/authentication_test.rb",
|
73
|
+
"templates/test/unit/member_test.rb"
|
74
|
+
]
|
75
|
+
s.homepage = %q{http://github.com/Fingertips/rails-template}
|
76
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
77
|
+
s.require_paths = ["bin"]
|
78
|
+
s.rubygems_version = %q{1.3.5}
|
79
|
+
s.summary = %q{A self contained version of the Fingertips Rails template}
|
80
|
+
|
81
|
+
if s.respond_to? :specification_version then
|
82
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
83
|
+
s.specification_version = 3
|
84
|
+
|
85
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
86
|
+
else
|
87
|
+
end
|
88
|
+
else
|
89
|
+
end
|
90
|
+
end
|
data/fingertips.rb
ADDED
@@ -0,0 +1,181 @@
|
|
1
|
+
# * Use plugins or gems?
|
2
|
+
# * Add an option which prepares the app for svn usage.
|
3
|
+
|
4
|
+
require 'fileutils'
|
5
|
+
|
6
|
+
TEMPLATE_HOME = ENV['TEMPLATE_HOME'] ||
|
7
|
+
'http://github.com/Fingertips/rails-template/raw/master/templates/'
|
8
|
+
|
9
|
+
class Rails::TemplateRunner
|
10
|
+
def name
|
11
|
+
File.basename(root)
|
12
|
+
end
|
13
|
+
|
14
|
+
def template_file(template)
|
15
|
+
contents = open(File.join(TEMPLATE_HOME, template)).read
|
16
|
+
contents.gsub!('{{app_name}}', name)
|
17
|
+
contents.gsub!('{{AppName}}', name.camelize)
|
18
|
+
file template, contents
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_cache(dir)
|
23
|
+
if ENV['TEST_TEMPLATE'] && File.exist?(File.join('../vendor_cache', dir))
|
24
|
+
puts "[!] Using #{dir} cache..."
|
25
|
+
FileUtils.cp_r "../vendor_cache/#{dir}", "vendor"
|
26
|
+
else
|
27
|
+
yield
|
28
|
+
if ENV['TEST_TEMPLATE']
|
29
|
+
puts "[!] Creating #{dir} cache..."
|
30
|
+
FileUtils.mkdir_p "../vendor_cache"
|
31
|
+
FileUtils.cp_r "vendor/#{dir}", "../vendor_cache"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
####
|
37
|
+
#
|
38
|
+
# Skeleton template
|
39
|
+
#
|
40
|
+
|
41
|
+
# Setup
|
42
|
+
|
43
|
+
template_file 'config/database.yml'
|
44
|
+
|
45
|
+
# Gems
|
46
|
+
|
47
|
+
environment "gem 'test-spec', :version => '~> 0.10.0', :lib => 'test/spec'", :env => :test
|
48
|
+
rake 'gems:install', :env => :test, :sudo => true
|
49
|
+
|
50
|
+
# Rails
|
51
|
+
|
52
|
+
test_cache 'rails' do
|
53
|
+
# On 2.3.4 the git command is broken as it only executes in_root
|
54
|
+
inside 'vendor' do
|
55
|
+
Git.run 'clone git://github.com/Fingertips/rails.git'
|
56
|
+
run 'cd rails && git remote add rails git://github.com/rails/rails.git'
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
# Plugins
|
61
|
+
|
62
|
+
test_cache 'plugins' do
|
63
|
+
plugin 'authentication-needed-san', :git => 'git://github.com/Fingertips/authentication-needed-san.git'
|
64
|
+
plugin 'authorization-san', :git => 'git://github.com/Fingertips/authorization-san.git'
|
65
|
+
plugin 'generator-san', :git => 'git://github.com/Fingertips/generator-san.git'
|
66
|
+
plugin 'on-test-spec', :git => 'git://github.com/Fingertips/on-test-spec.git'
|
67
|
+
plugin 'peiji-san', :git => 'git://github.com/Fingertips/peiji-san.git'
|
68
|
+
plugin 'risosu-san', :git => 'git://github.com/Fingertips/risosu-san.git'
|
69
|
+
plugin 'validates_email-san', :git => 'git://github.com/Fingertips/validates_email-san.git'
|
70
|
+
end
|
71
|
+
|
72
|
+
# Misc
|
73
|
+
|
74
|
+
template_file '.kick'
|
75
|
+
template_file 'Rakefile'
|
76
|
+
|
77
|
+
# Test
|
78
|
+
|
79
|
+
template_file 'test/test_helper.rb'
|
80
|
+
template_file 'test/ext/authentication.rb'
|
81
|
+
template_file 'test/ext/file_fixtures.rb'
|
82
|
+
template_file 'test/ext/time.rb'
|
83
|
+
|
84
|
+
# Lib
|
85
|
+
|
86
|
+
initializer 'core_ext.rb',
|
87
|
+
%{require 'active_record_ext'
|
88
|
+
|
89
|
+
ActiveRecord::Base.send(:extend, ActiveRecord::Ext)
|
90
|
+
ActiveRecord::Base.send(:include, ActiveRecord::BasicScopes)}
|
91
|
+
|
92
|
+
template_file 'lib/active_record_ext.rb'
|
93
|
+
template_file 'test/lib/active_record_ext_test.rb'
|
94
|
+
|
95
|
+
template_file 'lib/token.rb'
|
96
|
+
template_file 'test/lib/token_test.rb'
|
97
|
+
|
98
|
+
####
|
99
|
+
#
|
100
|
+
# Application template
|
101
|
+
#
|
102
|
+
|
103
|
+
initializer 'application.rb', %{SYSTEM_EMAIL_ADDRESS = '#{name.camelize} Support <support@example.com>'}
|
104
|
+
|
105
|
+
# Routes
|
106
|
+
|
107
|
+
# For some reason these routes are generated in the reversed order...
|
108
|
+
route 'map.root :controller => "members", :action => "new"'
|
109
|
+
route 'map.resource :session, :collection => { :clear => :get }'
|
110
|
+
route 'map.resources :passwords'
|
111
|
+
route 'map.resources :members'
|
112
|
+
|
113
|
+
# Models
|
114
|
+
|
115
|
+
generate :model_san, 'member role:string email:string hashed_password:string reset_password_token:string'
|
116
|
+
|
117
|
+
template_file 'app/models/member.rb'
|
118
|
+
template_file 'test/unit/member_test.rb'
|
119
|
+
template_file 'test/fixtures/members.yml'
|
120
|
+
|
121
|
+
template_file 'app/models/member/authentication.rb'
|
122
|
+
template_file 'test/unit/member/authentication_test.rb'
|
123
|
+
|
124
|
+
template_file 'app/models/mailer.rb'
|
125
|
+
template_file 'test/unit/mailer_test.rb'
|
126
|
+
|
127
|
+
# Controllers
|
128
|
+
|
129
|
+
initializer 'mime_types.rb', %{Mime::Type.register 'image/jpeg', :jpg}
|
130
|
+
|
131
|
+
template_file 'app/controllers/application_controller.rb'
|
132
|
+
template_file 'test/functional/application_controller_test.rb'
|
133
|
+
|
134
|
+
template_file 'app/controllers/members_controller.rb'
|
135
|
+
template_file 'test/functional/members_controller_test.rb'
|
136
|
+
|
137
|
+
template_file 'app/controllers/passwords_controller.rb'
|
138
|
+
template_file 'test/functional/passwords_controller_test.rb'
|
139
|
+
|
140
|
+
template_file 'app/controllers/sessions_controller.rb'
|
141
|
+
template_file 'test/functional/sessions_controller_test.rb'
|
142
|
+
|
143
|
+
# Helpers
|
144
|
+
|
145
|
+
template_file 'app/helpers/application_helper.rb'
|
146
|
+
template_file 'test/unit/helpers/application_helper_test.rb'
|
147
|
+
|
148
|
+
# Views
|
149
|
+
|
150
|
+
run 'rm public/index.html'
|
151
|
+
|
152
|
+
template_file 'public/403.html'
|
153
|
+
template_file 'public/stylesheets/default.css'
|
154
|
+
template_file 'public/stylesheets/reset.css'
|
155
|
+
template_file 'public/javascripts/ready.js'
|
156
|
+
|
157
|
+
template_file 'app/views/layouts/application.html.erb'
|
158
|
+
template_file 'app/views/layouts/_application_javascript_includes.html.erb'
|
159
|
+
template_file 'app/views/layouts/_head.html.erb'
|
160
|
+
|
161
|
+
template_file 'app/views/members/new.html.erb'
|
162
|
+
template_file 'app/views/members/show.html.erb'
|
163
|
+
template_file 'app/views/members/edit.html.erb'
|
164
|
+
|
165
|
+
template_file 'app/views/passwords/new.html.erb'
|
166
|
+
template_file 'app/views/passwords/sent.html.erb'
|
167
|
+
template_file 'app/views/passwords/edit.html.erb'
|
168
|
+
template_file 'app/views/passwords/reset.html.erb'
|
169
|
+
|
170
|
+
template_file 'app/views/sessions/new.html.erb'
|
171
|
+
template_file 'app/views/sessions/_form.html.erb'
|
172
|
+
template_file 'app/views/sessions/_status.html.erb'
|
173
|
+
|
174
|
+
template_file 'app/views/mailer/reset_password_message.erb'
|
175
|
+
|
176
|
+
# Finalize
|
177
|
+
|
178
|
+
rake 'db:create:all'
|
179
|
+
rake 'db:migrate'
|
180
|
+
|
181
|
+
exec 'rake test'
|
data/templates/.kick
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
# require 'ignore'
|
2
|
+
# ignore(//)
|
3
|
+
|
4
|
+
# App specific mappings
|
5
|
+
process do |files|
|
6
|
+
test_files = files.take_and_map do |file|
|
7
|
+
case file
|
8
|
+
when %r{^app/views/mailer/\w+\.erb$}
|
9
|
+
'test/unit/mailer_test.rb'
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
run_ruby_tests test_files
|
14
|
+
end
|
15
|
+
|
16
|
+
require 'rails'
|
17
|
+
require 'jstest'
|
18
|
+
|
19
|
+
# Update stories
|
20
|
+
# process do |files|
|
21
|
+
# execute "rake stories:convert" if files.delete('design/requirements.txt')
|
22
|
+
# end
|
data/templates/Rakefile
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
require(File.join(File.dirname(__FILE__), 'config', 'boot'))
|
2
|
+
|
3
|
+
require 'rake'
|
4
|
+
require 'rake/testtask'
|
5
|
+
require 'rake/rdoctask'
|
6
|
+
require 'tasks/rails'
|
7
|
+
|
8
|
+
namespace :test do
|
9
|
+
desc "Run the javascript tests in test/javascripts"
|
10
|
+
task :javascripts do
|
11
|
+
sh "jstest #{Dir['test/javascripts/*.html'].join(' ')}"
|
12
|
+
end
|
13
|
+
|
14
|
+
Rake::TestTask.new('lib') do |t|
|
15
|
+
t.test_files = FileList['test/lib/**/*_test.rb']
|
16
|
+
t.verbose = true
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
task :test do
|
21
|
+
Rake::Task['test:lib'].invoke
|
22
|
+
Rake::Task['test:javascripts'].invoke
|
23
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
class ApplicationController < ActionController::Base
|
2
|
+
helper :all
|
3
|
+
protect_from_forgery
|
4
|
+
filter_parameter_logging :password
|
5
|
+
before_filter :find_authenticated, :block_access, :set_actionmailer_host
|
6
|
+
# report_errors_to 'http://forestwatcher.example.com/{{app_name}}', :username => 'forestwatcher', :password => 'secret'
|
7
|
+
|
8
|
+
protected
|
9
|
+
|
10
|
+
# Responds with a http status code and an error document
|
11
|
+
def send_response_document(status)
|
12
|
+
format = (request.format === [Mime::XML, Mime::JSON]) ? request.format : Mime::HTML
|
13
|
+
status = interpret_status(status)
|
14
|
+
send_file "#{RAILS_ROOT}/public/#{status.to_i}.#{format.to_sym}",
|
15
|
+
:status => status,
|
16
|
+
:type => "#{format}; charset=utf-8",
|
17
|
+
:disposition => 'inline',
|
18
|
+
:stream => false
|
19
|
+
end
|
20
|
+
|
21
|
+
def find_authenticated
|
22
|
+
@authenticated = Member.find_by_id(request.session[:member_id]) unless request.session[:member_id].blank?
|
23
|
+
end
|
24
|
+
|
25
|
+
# Handles interaction when the client may not access the current resource
|
26
|
+
def access_forbidden
|
27
|
+
if !@authenticated.nil?
|
28
|
+
send_response_document :forbidden
|
29
|
+
else
|
30
|
+
flash.keep
|
31
|
+
authentication_needed!
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def when_authentication_needed
|
36
|
+
redirect_to new_session_url
|
37
|
+
end
|
38
|
+
|
39
|
+
# Set the hostname of the server on ActionMailer
|
40
|
+
def set_actionmailer_host
|
41
|
+
ActionMailer::Base.default_url_options[:host] = request.host_with_port
|
42
|
+
end
|
43
|
+
|
44
|
+
def login(member)
|
45
|
+
request.session[:member_id] = member.id
|
46
|
+
end
|
47
|
+
|
48
|
+
def logout
|
49
|
+
request.session.delete(:member_id)
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
class MembersController < ApplicationController
|
2
|
+
allow_access(:authenticated) { @authenticated.to_param == params[:id] }
|
3
|
+
allow_access :all, :only => [:new, :create, :show]
|
4
|
+
|
5
|
+
before_filter :find_member, :only => [:show, :edit, :update]
|
6
|
+
|
7
|
+
def new
|
8
|
+
@member = Member.new
|
9
|
+
end
|
10
|
+
|
11
|
+
def create
|
12
|
+
@member = Member.new(params[:member])
|
13
|
+
|
14
|
+
if @member.save
|
15
|
+
login(@member)
|
16
|
+
redirect_to root_url
|
17
|
+
else
|
18
|
+
render :new
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def update
|
23
|
+
@member.update_attributes(params[:member])
|
24
|
+
redirect_to member_url(@member)
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def find_member
|
30
|
+
@member = Member.find(params[:id])
|
31
|
+
end
|
32
|
+
end
|