Created
May 6, 2009 05:13
-
-
Save balinterdi/107361 to your computer and use it in GitHub Desktop.
Rails app template for the acts_as_trivia gem
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# App template for generating acts_as_trivia enable applications | |
# See http://github.com/balinterdi/acts_as_trivia/tree/master | |
def ask_with_default(question, default='') | |
user_answer = ask(question).strip | |
user_answer.empty? ? default : user_answer | |
end | |
# generate a model class | |
model_name_and_attributes = ask_with_default("Define the model in Rails resource generate style. (e.g country name:string population:integer)", "country name:string population:integer") | |
model_name_and_attributes = model_name_and_attributes.split(/\s+/).select { |token| !token.empty? } | |
model_name, attributes = model_name_and_attributes.first.downcase, model_name_and_attributes[1..-1] | |
generate(:resource, model_name, *attributes.join(' ')) | |
# generating a simple user class | |
generate(:resource, "user", "login:string", "password:string") | |
# install the acts_as_trivia gem | |
gem "balinterdi-acts_as_trivia", :lib => "acts_as_trivia", :source => "http://gems.github.com" | |
rake "gems:unpack" | |
# create acts_as_trivia related controllers and views and create a trivia question | |
trivia_about = ask_with_default("Which attribute of the model should the trivia be about? (e.g population)", "population") | |
trivia_displayed = ask_with_default("Which attribute of the model should be displayed in the trivia? (e.g name)", "name") | |
generate(:acts_as_trivia, model_name, trivia_about, trivia_displayed) | |
rake "db:migrate" | |
# create a default user | |
user_name = ask("A user name to create?") | |
run %(./script/runner "User.create(:login => '#{user_name}', :password => '#{user_name}')") | |
# create some model instances for the trivia (e.g countries) | |
attribute_names = attributes.map{ |attr_and_type| attr_and_type.split(":").first } | |
num_model_instances = ask_with_default("How many #{model_name} instances would you like to create? (0 to skip this)", 0).to_i | |
num_model_instances.times do |i| | |
puts "#{i+1}. instance" | |
attr_hash = {} | |
attribute_names.each do |attr| | |
value = ask("#{attr}:") | |
attr_hash[attr] = value | |
end | |
attr_values_stringified = attr_hash.map { |attr, value| ":#{attr} => '#{value}'"}.join(", ") | |
run %(./script/runner "model = #{model_name.camelize}.create(#{attr_values_stringified})") | |
end | |
file "app/controllers/trivia_answers_controller.rb", <<-EOS | |
class TriviaAnswersController < ApplicationController | |
before_filter :find_trivia | |
before_filter :find_user | |
def new | |
@trivia_objects = @trivia.get_subjects | |
end | |
def create | |
@trivia_answer = TriviaAnswer.new(:user_id => @user, :trivia_id => @trivia) | |
@trivia_answer.points = @trivia_answer.assess(params[@trivia.on.to_sym][@trivia.about.to_sym]) | |
if @trivia_answer.save | |
flash[:ok] = "You got \#{@trivia_answer.points} right" | |
# show the solution for the trivia | |
redirect_to user_trivia_trivia_answer_path(@user, @trivia, @trivia_answer) | |
end | |
end | |
def show | |
@trivia_answer = TriviaAnswer.find(params[:id]) | |
end | |
private | |
def find_trivia | |
@trivia = Trivia.find(params[:trivia_id]) | |
end | |
def find_user | |
@user = User.find(params[:user_id]) | |
end | |
end | |
EOS | |
file "app/views/trivia_answers/new.html.erb", <<-EOS | |
<% form_for :trivia_answer, @trivia_answer, :url => user_trivia_trivia_answers_path(@user, @trivia) do |f| -%> | |
<%= trivia_user_panel(@trivia) %> | |
<%= f.submit "Submit answer" %> | |
<% end -%> | |
EOS | |
file "app/views/trivia_answers/show.html.erb", <<-EOS | |
<% with_each_solution_value(@trivia) do |i, name, value| -%> | |
<p><%= "\#{i}. \#{name}: \#{value}" %></p> | |
<% end -%> | |
EOS |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment