2012-03-13_08.54.13
Hidden field in a form: f.hidden_field(:list_id)
Nested resources:
resources :students resources :grades
But is a top-level list of grades any good?
Do this in routes.rb
resources :students do resources :grades end
students/1
students/1/grades
students/1/grades/4
1 is :student_id, 4 is :id for grade
Coffeescript:
coffeescript.org
It is the default syntax for Rails 3.1 and up
$(function() { $("#aha_learned_on").dateicker();
becomes
$ -> $("#aha_learned_on").datepicker()
For code block, you indent instead of using braces. Indentation is meaningful. So use soft tabs.
We need parentheses if the function takes 0 parameters.
$("#new_item_link").click (e)-> $("#new_aha").fadeIn() $("#new_item_link").hide() e.preventDefault()
HAML:
Put in two gems:
gem 'haml' gem 'haml-rails'
gem 'haml-rails', :group => :development
rails generate scaffold landmark name:string rating:integer
So we get haml:
ericm@finance:~/ruby/codeAcademy/week10/LandmarksApp$ rails generate scaffold landmark name:string rating:integer invoke active_record create db/migrate/20120313152347_create_landmarks.rb create app/models/landmark.rb invoke test_unit create test/unit/landmark_test.rb create test/fixtures/landmarks.yml route resources :landmarks invoke scaffold_controller create app/controllers/landmarks_controller.rb invoke haml create app/views/landmarks create app/views/landmarks/index.html.haml create app/views/landmarks/edit.html.haml create app/views/landmarks/show.html.haml create app/views/landmarks/new.html.haml create app/views/landmarks/_form.html.haml invoke test_unit create test/functional/landmarks_controller_test.rb invoke helper create app/helpers/landmarks_helper.rb invoke test_unit create test/unit/helpers/landmarks_helper_test.rb invoke assets invoke coffee create app/assets/javascripts/landmarks.js.coffee invoke scss create app/assets/stylesheets/landmarks.css.scss invoke scss create app/assets/stylesheets/scaffolds.css.scss ericm@finance:~/ruby/codeAcademy/week10/LandmarksApp$
In HAML, whitespace is significant
For classes for p tag, you could do this:
p.red.something
Back from break
If you have a list of items with an association:
has_many :items
you can use :dependent with :delete, :delete_all will delete without calling callbacks (like if you have some email actions), :nullify removes foreign key
has_many :items, :dependent => :destroy
Use twitter authentication
Create a sessions controller
rails g controller sessions new create
The create action will be called by Twitter
class SessionsController < ApplicationsController def create logger.debug "hello" # logger.debug request.env['omniauth.auth'].inspect auth_data = request.env['omniauth.auth'] logger.debug "Provider: #{auth_data['Provider']}" end end
Routes:
get "sessions/create"
Use the omniauth gem
This gem will add routes to your application.
1. Register your app with twitter at https://dev.twitter.com
You get Access Level, Consumer Key, Consumer Secret, Request Token URL, Authorize URL, Access Token URL, Callback URL
We set the callback URL
You need to put in 127.0.0.1 instead of localhost for dev
2. In gem file
You need to add a gem for each “strategy” https://github.com/intridea/omniauth/wiki/List-of-Strategies
gem 'omniauth-twitter'
There is no base omniauth that we need to add.
The strategy gems depend on the base omniauth gem, and they will fetch it.
3. Write an omniauth initializer
in config/initializers: any code there will be run once – no naming standard
Create a file called config/initializers/omniauth.rb
Add this:
Rails.application.config.middleware.use OmniAuth::Builder do provider :developer unless Rails.env.production? provider :twitter, ENV['TWITTER_KEY'], ENV['TWITTER_SECRET'] end
In routes put
match '/auth/:provider/callback', to: 'sessions#create'
match will map to any HTTP verb
In application layout: add a signin link
<%= link_to 'sign in with twitter', "/auth/developer" %>
So your user model could just have a column for Provider and UID
You could get other stuff from hash
They have provider :twitter, ENV[‘TWITTER_KEY’], ENV[‘TWITTER_SECRET’]
environment variables are part of operating system
To view them:
env | sort
in irb, type “ENV”
ENV[“PATH”] is the OS “path” environment variables
So you can add it in the environment. It only works on a specific machine. Good luck deploying to Heroku
In terminal:
export TWITTER_KEY="adhflsblsdfbsdlfhsbdlbf" export TWITTER_SECRET="gpwpilwopohbnmiuhuftttdfg" heroku config:add TWITTER_KEY="adhflsblsdfbsdlfhsbdlbf"
print them out:
heroku config
2012-03-15_08.28.54
cron tasks:
devcenter.heroku.com/articles/cron
1. create a file lib/tasks called cron.rake
2.
3.
4. desc “import tweets”
5. task :cron => environment do
6.
7. end
heroku rake cron
——————
<%= f.collection_select(:runner_id, Runner.all, :id, :name) %>
a
This is from Entry form. Entry belongs_to runner, runner has many entries
So :runner_id is the field in Runner, id is from runner, name is also from runner
foreign key, table, what to save as the foreign key, what to display