rostra 0.0.8 → 0.0.9

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc CHANGED
@@ -28,7 +28,17 @@ Call <tt>rostra</tt> in your user model:
28
28
  rostra
29
29
  end
30
30
 
31
+ == Basic configuration
32
+ There's some stuff you'll almost definitely want to do in order to get Rostra working correctly for your app. First, set the <tt>default_url_options</tt> for your app. In each of your <tt>config/environment</tt> files you should have something like:
31
33
 
34
+ config.action_mailer.default_url_options = { :host => 'test.com' } # test.rb
35
+ config.action_mailer.default_url_options = { :host => 'localhost:3000' } # development.rb
36
+ config.action_mailer.default_url_options = { :host => 'your_domain.com' } # production.rb
37
+
38
+ Also, be sure to read through <tt>config/initializers/rostra.rb</tt> and override configuration options to suit your app. At the very least, you'll want to change:
39
+
40
+ config.deliver_emails_from = 'change_me@example.com'
41
+ `
32
42
  == Customizing the question and answer models
33
43
  Rostra provides a DSL for adding application specific logic to <tt>Rostra::Question</tt> and <tt>Rostra:Answer</tt>:
34
44
 
@@ -175,7 +175,7 @@ form#new_rostra_answer {
175
175
  border-top: 2px solid #ccc;
176
176
  margin-top: 50px;
177
177
  }
178
- form#new_rostra_answer .field label {
178
+ form#new_rostra_answer .field label.text {
179
179
  font-size: 16px;
180
180
  margin-bottom: 10px;
181
181
  }
@@ -33,6 +33,16 @@ span.error {
33
33
  top: 5px;
34
34
  right: -5px;
35
35
  }
36
+
37
+ .boolean label {
38
+ display: inline;
39
+ margin-left: 5px;
40
+ }
41
+ .boolean input[type="checkbox"] {
42
+ display: inline;
43
+ width: auto;
44
+ }
45
+
36
46
  .field_with_errors input,
37
47
  .field_with_errors textarea {
38
48
  background: #fde6e4;
@@ -0,0 +1,15 @@
1
+ module Rostra
2
+ class ApplicationMailer < ActionMailer::Base
3
+
4
+ def notification(user, question)
5
+ @user = user
6
+ @question = question
7
+ mail(
8
+ :to => user.rostra_user_email,
9
+ :subject => "There's been activity on: #{question.title}",
10
+ :from => Rostra::Config.deliver_emails_from
11
+ )
12
+ end
13
+
14
+ end
15
+ end
@@ -1,6 +1,7 @@
1
1
  class Comment < ActiveRecord::Base
2
2
 
3
3
  include ActsAsCommentable::Comment
4
+ include Rostra::EmailNotifier
4
5
 
5
6
  belongs_to :commentable, :polymorphic => true
6
7
  belongs_to :user
@@ -10,4 +11,8 @@ class Comment < ActiveRecord::Base
10
11
 
11
12
  default_scope :order => 'created_at ASC'
12
13
 
14
+ def question
15
+ commentable.question if commentable.is_a?(Rostra::Answer)
16
+ end
17
+
13
18
  end
@@ -1,5 +1,7 @@
1
1
  module Rostra
2
2
  class Answer < ActiveRecord::Base
3
+ include Rostra::EmailNotifier
4
+
3
5
  belongs_to :question
4
6
  belongs_to :user
5
7
 
@@ -7,5 +9,16 @@ module Rostra
7
9
  acts_as_commentable
8
10
 
9
11
  validates :text, :presence => true
12
+
13
+ before_save :create_question_following
14
+
15
+ attr_accessor :follow_by_email
16
+
17
+ private
18
+
19
+ def create_question_following
20
+ question.followers << user unless follow_by_email.to_i.zero?
21
+ end
22
+
10
23
  end
11
24
  end
@@ -3,6 +3,8 @@ module Rostra
3
3
 
4
4
  belongs_to :user
5
5
  has_many :answers
6
+ has_many :question_followings
7
+ has_many :followers, through: :question_followings, source: :user
6
8
 
7
9
  acts_as_taggable
8
10
  acts_as_voteable
@@ -12,13 +14,15 @@ module Rostra
12
14
  validates :user, :presence => true
13
15
  validates :tag_list, :presence => true
14
16
 
17
+ before_save :create_question_following
18
+ attr_accessor :follow_by_email
19
+
15
20
  # Finds questions asked within the last 15 days ordered by non-unique page views.
16
21
  #
17
22
  def self.trending(limit = 5)
18
23
  Question.where(created_at: (15.days.ago)..(Time.now)).limit(limit)
19
24
 
20
25
  # This code doesn't work in postgres.
21
- #
22
26
  # Question
23
27
  # .where(created_at: (15.days.ago)..(Time.now))
24
28
  # .limit(limit)
@@ -35,5 +39,11 @@ module Rostra
35
39
  impressionist_count(filter: :ip_address)
36
40
  end
37
41
 
42
+ private
43
+
44
+ def create_question_following
45
+ followers << user unless follow_by_email.to_i.zero?
46
+ end
47
+
38
48
  end
39
49
  end
@@ -0,0 +1,6 @@
1
+ module Rostra
2
+ class QuestionFollowing < ActiveRecord::Base
3
+ belongs_to :user
4
+ belongs_to :question
5
+ end
6
+ end
@@ -4,5 +4,6 @@
4
4
  <%= f.hidden_field :user_id, value: rostra_user.id %>
5
5
  <%= f.hidden_field :question_id, value: @question.id %>
6
6
  <%= f.input :text, label: 'Answer this question', input_html: { class: 'wysiwyg' } %>
7
+ <%= f.input :follow_by_email, as: :boolean, input_html: { checked: true }, label: "I want to follow answers and comments on this question" %>
7
8
  <%= f.submit @answer.new_record? ? 'Answer' : 'Update' %>
8
9
  <% end %>
@@ -0,0 +1,5 @@
1
+ <h3>Hi <%= @user.rostra_user_name %></h3>
2
+
3
+ <p>Just letting you know there's been recent activity on <%= link_to @question.title, question_url(@question) %></p>
4
+
5
+ <p><%= link_to "View the question", question_path(@question) %></p>
@@ -0,0 +1,5 @@
1
+ --- Hi <%= @user.rostra_user_name %> ---
2
+
3
+ Just letting you know there's been recent activity on <%= @question.title %>
4
+
5
+ View the question visit: <%= question_path(@question) %>
@@ -3,5 +3,6 @@
3
3
  <%= f.input :title %>
4
4
  <%= f.input :details, input_html: {class: 'wysiwyg'} %>
5
5
  <%= f.input :tag_list, label: 'Tags', hint: 'Separate tags with commas' %>
6
+ <%= f.input :follow_by_email, as: :boolean, input_html: { checked: true }, label: "I want to follow answers and comments on this question" %>
6
7
  <%= f.submit "Post your question" %>
7
8
  <% end %>
@@ -0,0 +1,10 @@
1
+ class CreateRostraQuestionFollowings < ActiveRecord::Migration
2
+ def change
3
+ create_table :rostra_question_followings do |t|
4
+ t.integer :question_id
5
+ t.integer :user_id
6
+
7
+ t.timestamps
8
+ end
9
+ end
10
+ end
@@ -1,5 +1,8 @@
1
1
  # Use this setup block to configure all options available in Rostra.
2
2
  Rostra::Config.setup do |config|
3
+ # Helper method used to access current user in the view
4
+ # config.deliver_emails_from = 'change_me@example.com'
5
+
3
6
  # Helper method used to access current user in the view
4
7
  # config.rostra_user = :current_user
5
8
 
data/lib/rostra/config.rb CHANGED
@@ -1,5 +1,9 @@
1
1
  module Rostra
2
2
  module Config
3
+ # Helper method used to access current user in the view
4
+ mattr_accessor :deliver_emails_from
5
+ @@deliver_emails_from = 'change_me@example.com'
6
+
3
7
  # Helper method used to access current user in the view
4
8
  mattr_accessor :rostra_user
5
9
  @@rostra_user = :current_user
@@ -0,0 +1,21 @@
1
+ module Rostra
2
+ module EmailNotifier
3
+
4
+ def self.included(base)
5
+ base.after_create :notify_followers
6
+ end
7
+
8
+ private
9
+
10
+ # Send email notification to everyone who is following the question. Of course,
11
+ # don't send notification to the person that created the answer/comment.
12
+ #
13
+ def notify_followers
14
+ question.followers.each do |user|
15
+ next if self.user == user
16
+ ApplicationMailer.notification(user, question).deliver
17
+ end
18
+ end
19
+
20
+ end
21
+ end
data/lib/rostra/engine.rb CHANGED
@@ -8,6 +8,7 @@ module Rostra
8
8
  require 'thumbs_up'
9
9
  require 'acts_as_commentable'
10
10
  require 'impressionist'
11
+ require_relative 'email_notifier'
11
12
 
12
13
  isolate_namespace Rostra
13
14
 
@@ -1,3 +1,3 @@
1
1
  module Rostra
2
- VERSION = "0.0.8"
2
+ VERSION = "0.0.9"
3
3
  end
data/lib/rostra.rb CHANGED
@@ -18,9 +18,12 @@ module Rostra
18
18
  # end
19
19
  #
20
20
  def rostra(&block)
21
- has_many :questions
22
- has_many :answers
21
+ has_many :questions, class_name: 'Rostra::Question'
22
+ has_many :answers, class_name: 'Rostra::Answer'
23
23
  has_many :comments
24
+ has_many :question_followings, class_name: 'Rostra::QuestionFollowing'
25
+ has_many :followed_questions, through: :question_followings, class_name: 'Rostra::Question', source: :question
26
+
24
27
  acts_as_voter
25
28
 
26
29
  include InstanceMethods
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: rostra
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.0.8
5
+ version: 0.0.9
6
6
  platform: ruby
7
7
  authors:
8
8
  - Cory Schires
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-10-18 00:00:00 -05:00
13
+ date: 2011-10-19 00:00:00 -05:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
@@ -200,6 +200,17 @@ dependencies:
200
200
  version: "0"
201
201
  type: :development
202
202
  version_requirements: *id017
203
+ - !ruby/object:Gem::Dependency
204
+ name: email_spec
205
+ prerelease: false
206
+ requirement: &id018 !ruby/object:Gem::Requirement
207
+ none: false
208
+ requirements:
209
+ - - ">="
210
+ - !ruby/object:Gem::Version
211
+ version: "0"
212
+ type: :development
213
+ version_requirements: *id018
203
214
  description: Don't use. Not production ready
204
215
  email:
205
216
  - coryschires@gmail.com
@@ -479,16 +490,20 @@ files:
479
490
  - app/controllers/rostra/comments_controller.rb
480
491
  - app/controllers/rostra/questions_controller.rb
481
492
  - app/helpers/rostra/application_helper.rb
493
+ - app/mailers/rostra/application_mailer.rb
482
494
  - app/models/comment.rb
483
495
  - app/models/rostra/ability.rb
484
496
  - app/models/rostra/answer.rb
485
497
  - app/models/rostra/question.rb
498
+ - app/models/rostra/question_following.rb
486
499
  - app/models/rostra/vote.rb
487
500
  - app/models/vote.rb
488
501
  - app/views/layouts/rostra/application.html.erb
489
502
  - app/views/rostra/answers/_form.html.erb
490
503
  - app/views/rostra/answers/edit.html.erb
491
504
  - app/views/rostra/answers/vote.js.erb
505
+ - app/views/rostra/application_mailer/notification.html.erb
506
+ - app/views/rostra/application_mailer/notification.text.erb
492
507
  - app/views/rostra/questions/_form.html.erb
493
508
  - app/views/rostra/questions/edit.html.erb
494
509
  - app/views/rostra/questions/index.html.erb
@@ -509,9 +524,11 @@ files:
509
524
  - db/migrate/20111008224511_thumbs_up_migration.rb
510
525
  - db/migrate/20111012020025_create_comments.rb
511
526
  - db/migrate/20111016021105_create_impressions_table.rb
527
+ - db/migrate/20111019162723_create_rostra_question_followings.rb
512
528
  - lib/generators/rostra/install_generator.rb
513
529
  - lib/generators/rostra/templates/config/initializers/rostra.rb
514
530
  - lib/rostra/config.rb
531
+ - lib/rostra/email_notifier.rb
515
532
  - lib/rostra/engine.rb
516
533
  - lib/rostra/version.rb
517
534
  - lib/rostra.rb