commontator 2.0.1 → 2.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/README.md +1 -1
- data/app/controllers/commontator/application_controller.rb~ +27 -0
- data/app/controllers/commontator/comments_controller.rb~ +20 -12
- data/app/controllers/commontator/subscriptions_controller.rb~ +32 -0
- data/app/controllers/commontator/threads_controller.rb~ +42 -0
- data/app/mailers/commontator/subscriptions_mailer.rb~ +50 -0
- data/app/models/commontator/comment.rb~ +2 -6
- data/app/models/commontator/subscription.rb~ +2 -5
- data/app/models/commontator/thread.rb~ +5 -7
- data/app/views/commontator/comments/_actions.html.erb~ +30 -0
- data/app/views/commontator/comments/_votes.html.erb~ +1 -1
- data/app/views/commontator/shared/_thread.html.erb~ +20 -0
- data/app/views/commontator/subscriptions/_link.html.erb~ +16 -0
- data/app/views/commontator/threads/_show.html.erb~ +62 -0
- data/config/initializers/commontator.rb~ +1 -1
- data/config/routes.rb~ +22 -0
- data/db/migrate/0_install.rb~ +1 -1
- data/db/migrate/{0_install.rb → 0_install_commontator.rb} +1 -1
- data/lib/commontator/controller_includes.rb~ +22 -0
- data/lib/commontator/shared_helper.rb~ +42 -0
- data/lib/commontator/version.rb +1 -1
- data/lib/commontator/version.rb~ +1 -1
- data/spec/app/controllers/commontator/comments_controller_spec.rb~ +55 -2
- data/spec/app/controllers/commontator/subscriptions_controller_spec.rb~ +16 -16
- data/spec/app/controllers/commontator/threads_controller_spec.rb~ +1 -1
- data/spec/app/helpers/commontator/application_helper_spec.rb~ +2 -0
- data/spec/app/helpers/commontator/threads_helper_spec.rb~ +1 -1
- data/spec/app/mailers/commontator/subscriptions_mailer_spec.rb~ +1 -1
- data/spec/app/models/commontator/comment_spec.rb~ +1 -1
- data/spec/app/models/commontator/subscription_spec.rb~ +1 -1
- data/spec/app/models/commontator/thread_spec.rb~ +1 -1
- data/spec/dummy/Rakefile~ +1 -1
- data/spec/dummy/config.ru~ +4 -0
- data/spec/dummy/config/application.rb~ +23 -0
- data/spec/dummy/config/environment.rb~ +5 -0
- data/spec/dummy/config/environments/development.rb~ +31 -0
- data/spec/dummy/config/environments/production.rb~ +67 -0
- data/spec/dummy/config/environments/test.rb~ +31 -0
- data/spec/dummy/config/initializers/secret_token.rb~ +12 -0
- data/spec/dummy/db/development.sqlite3 +0 -0
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/dummy/log/development.log +1250 -0
- data/spec/dummy/log/test.log +170101 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/02d4b791eb831cf2057bf4703a1218d1 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/0f196a1a50363b0a076ec6e1ee5417f6 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/a3fb9025f90ff05a6fd4afc7ded2692c +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/a41c8be5379abec3c0d0d98e2f0d5609 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/c69ee3cc5796188d873574179290a6ef +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/e1f674c11941d62aac1764ef3a7134e4 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/e85565206c3e5fdf9dfeb367c85557b1 +0 -0
- data/spec/lib/commontator/acts_as_commontable_spec.rb~ +2 -2
- data/spec/lib/commontator/acts_as_commontator_spec.rb~ +1 -1
- data/spec/lib/commontator/commontable_config_spec.rb~ +1 -1
- data/spec/lib/commontator/commontator_config_spec.rb~ +1 -1
- data/spec/lib/commontator/controller_includes_spec.rb~ +3 -3
- data/spec/lib/commontator/shared_helper_spec.rb~ +7 -3
- data/spec/lib/commontator_spec.rb~ +1 -1
- data/spec/test_helper.rb~ +37 -0
- metadata +61 -31
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 8e80641594c9354508803c783181a053cadf8d5b
|
4
|
+
data.tar.gz: 656bda25be213ff0f5186c363d02ac8f63667e07
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: afe7369d598e62151110282f724582724e261e44814bf57582ad86221c0a8b3d25b8f530a95023526f8529fc4fb284debafd38c24dcf8e8db7d09b5a33af88cb
|
7
|
+
data.tar.gz: 295d8301ae86ad273f2604dafcf257f88b44593dc74e105dcb32461c14ee856aa56faf4a5cf99c28743c64ac80fcb919592556e835422f25fc8c0fa0a2f8c581
|
data/README.md
CHANGED
@@ -0,0 +1,27 @@
|
|
1
|
+
module Commontator
|
2
|
+
class CommontatorController < ActionController::Base
|
3
|
+
before_filter :get_user
|
4
|
+
|
5
|
+
cattr_accessor :commontable_url
|
6
|
+
|
7
|
+
rescue_from SecurityTransgression, :with => lambda { head(:forbidden) }
|
8
|
+
|
9
|
+
protected
|
10
|
+
|
11
|
+
def get_user
|
12
|
+
@user = self.send Commontator.current_user_method
|
13
|
+
raise SecurityTransgression unless (@user.nil? || @user.is_commontator)
|
14
|
+
end
|
15
|
+
|
16
|
+
def get_thread
|
17
|
+
@thread = params[:thread_id].blank? ? \
|
18
|
+
Commontator::Thread.find(params[:id]) : \
|
19
|
+
Commontator::Thread.find(params[:thread_id])
|
20
|
+
raise SecurityTransgression if @thread.commontable.nil?
|
21
|
+
end
|
22
|
+
|
23
|
+
def set_commontable_url
|
24
|
+
self.commontable_url = @thread.config.commontable_url_proc.call(main_app, @thread.commontable)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -1,10 +1,10 @@
|
|
1
1
|
module Commontator
|
2
|
-
class CommentsController < ApplicationController
|
2
|
+
class CommentsController < Commontator::ApplicationController
|
3
3
|
before_filter :get_thread, :only => [:new, :create]
|
4
4
|
before_filter :get_comment_and_thread, :except => [:new, :create]
|
5
5
|
before_filter :set_commontable_url, :only => :create
|
6
6
|
|
7
|
-
# GET /1/comments/new
|
7
|
+
# GET /threads/1/comments/new
|
8
8
|
def new
|
9
9
|
@comment = Comment.new
|
10
10
|
@comment.thread = @thread
|
@@ -19,9 +19,10 @@ module Commontator
|
|
19
19
|
|
20
20
|
end
|
21
21
|
|
22
|
-
# POST /1/comments
|
22
|
+
# POST /threads/1/comments
|
23
23
|
def create
|
24
|
-
@comment = Comment.new
|
24
|
+
@comment = Comment.new
|
25
|
+
@comment.body = params[:comment][:body] unless params[:comment].nil?
|
25
26
|
@comment.thread = @thread
|
26
27
|
@comment.creator = @user
|
27
28
|
|
@@ -29,6 +30,12 @@ module Commontator
|
|
29
30
|
|
30
31
|
respond_to do |format|
|
31
32
|
if @comment.save
|
33
|
+
@thread.subscribe(@user) if @thread.config.auto_subscribe_on_comment
|
34
|
+
@thread.add_unread_except_for(@user)
|
35
|
+
recipients = @thread.active_subscribers.reject{|s| s == @user}
|
36
|
+
SubscriptionsMailer.comment_created(@comment, recipients).deliver \
|
37
|
+
unless recipients.empty?
|
38
|
+
|
32
39
|
format.html { redirect_to @thread }
|
33
40
|
format.js
|
34
41
|
else
|
@@ -48,13 +55,14 @@ module Commontator
|
|
48
55
|
end
|
49
56
|
end
|
50
57
|
|
51
|
-
#
|
58
|
+
# PATCH /comments/1
|
52
59
|
def update
|
53
60
|
raise SecurityTransgression unless @comment.can_be_edited_by?(@user)
|
61
|
+
@comment.body = params[:comment][:body] unless params[:comment].nil?
|
54
62
|
@comment.editor = @user
|
55
63
|
|
56
64
|
respond_to do |format|
|
57
|
-
if @comment.
|
65
|
+
if @comment.save
|
58
66
|
format.html { redirect_to @thread }
|
59
67
|
format.js
|
60
68
|
else
|
@@ -64,12 +72,12 @@ module Commontator
|
|
64
72
|
end
|
65
73
|
end
|
66
74
|
|
67
|
-
#
|
75
|
+
# PATCH /comments/1/delete
|
68
76
|
def delete
|
69
77
|
raise SecurityTransgression unless @comment.can_be_deleted_by?(@user)
|
70
78
|
|
71
79
|
@comment.errors.add(:base, 'This comment has already been deleted.') \
|
72
|
-
unless @comment.
|
80
|
+
unless @comment.delete_by(@user)
|
73
81
|
|
74
82
|
respond_to do |format|
|
75
83
|
format.html { redirect_to @thread }
|
@@ -77,7 +85,7 @@ module Commontator
|
|
77
85
|
end
|
78
86
|
end
|
79
87
|
|
80
|
-
#
|
88
|
+
# PATCH /comments/1/undelete
|
81
89
|
def undelete
|
82
90
|
raise SecurityTransgression unless @comment.can_be_deleted_by?(@user)
|
83
91
|
|
@@ -90,7 +98,7 @@ module Commontator
|
|
90
98
|
end
|
91
99
|
end
|
92
100
|
|
93
|
-
#
|
101
|
+
# PATCH /comments/1/upvote
|
94
102
|
def upvote
|
95
103
|
raise SecurityTransgression unless @comment.can_be_voted_on_by?(@user)
|
96
104
|
|
@@ -102,7 +110,7 @@ module Commontator
|
|
102
110
|
end
|
103
111
|
end
|
104
112
|
|
105
|
-
#
|
113
|
+
# PATCH /comments/1/downvote
|
106
114
|
def downvote
|
107
115
|
raise SecurityTransgression unless @comment.can_be_voted_on_by?(@user)
|
108
116
|
|
@@ -114,7 +122,7 @@ module Commontator
|
|
114
122
|
end
|
115
123
|
end
|
116
124
|
|
117
|
-
#
|
125
|
+
# PATCH /comments/1/unvote
|
118
126
|
def unvote
|
119
127
|
raise SecurityTransgression unless @comment.can_be_voted_on_by?(@user)
|
120
128
|
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Commontator
|
2
|
+
class SubscriptionsController < Commontator::ApplicationController
|
3
|
+
before_filter :get_thread
|
4
|
+
|
5
|
+
# PATCH threads/1/subscribe
|
6
|
+
def subscribe
|
7
|
+
raise SecurityTransgression unless @thread.can_subscribe?(@user)
|
8
|
+
|
9
|
+
@thread.errors.add(:subscription, "You are already subscribed to this thread") \
|
10
|
+
unless @thread.subscribe(@user)
|
11
|
+
|
12
|
+
respond_to do |format|
|
13
|
+
format.html { redirect_to @thread }
|
14
|
+
format.js { render :subscribe }
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
# PATCH threads/1/unsubscribe
|
20
|
+
def unsubscribe
|
21
|
+
raise SecurityTransgression unless @thread.can_subscribe?(@user)
|
22
|
+
|
23
|
+
@thread.errors.add(:subscription, "You are not subscribed to this thread") \
|
24
|
+
unless @thread.unsubscribe(@user)
|
25
|
+
|
26
|
+
respond_to do |format|
|
27
|
+
format.html { redirect_to @thread }
|
28
|
+
format.js { render :subscribe }
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module Commontator
|
2
|
+
class ThreadsController < Commontator::ApplicationController
|
3
|
+
before_filter :get_thread
|
4
|
+
before_filter :set_commontable_url, :only => :show
|
5
|
+
|
6
|
+
# GET /threads/1
|
7
|
+
def show
|
8
|
+
commontator_thread_show(@thread.commontable)
|
9
|
+
|
10
|
+
respond_to do |format|
|
11
|
+
format.html { redirect_to commontable_url }
|
12
|
+
format.js
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
# PATCH /threads/1/close
|
17
|
+
def close
|
18
|
+
raise SecurityTransgression unless @thread.can_be_edited_by?(@user)
|
19
|
+
|
20
|
+
@thread.errors.add(:base, 'This thread has already been closed.') \
|
21
|
+
unless @thread.close(@user)
|
22
|
+
|
23
|
+
respond_to do |format|
|
24
|
+
format.html { redirect_to @thread }
|
25
|
+
format.js { render :show }
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
# PUT /threads/1/reopen
|
30
|
+
def reopen
|
31
|
+
raise SecurityTransgression unless @thread.can_be_edited_by?(@user)
|
32
|
+
|
33
|
+
@thread.errors.add(:base, 'This thread is not closed.') \
|
34
|
+
unless @thread.reopen
|
35
|
+
|
36
|
+
respond_to do |format|
|
37
|
+
format.html { redirect_to @thread }
|
38
|
+
format.js { render :show }
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module Commontator
|
2
|
+
class SubscriptionsMailer < ActionMailer::Base
|
3
|
+
include SharedHelper
|
4
|
+
include ThreadsHelper
|
5
|
+
|
6
|
+
def comment_created(comment, recipients)
|
7
|
+
setup_variables(comment, recipients)
|
8
|
+
|
9
|
+
mail :to => 'Undisclosed Recipients'
|
10
|
+
:bcc => @bcc,
|
11
|
+
:from => @from,
|
12
|
+
:subject => @subject
|
13
|
+
end
|
14
|
+
|
15
|
+
protected
|
16
|
+
|
17
|
+
def setup_variables(comment, recipients)
|
18
|
+
@comment = comment
|
19
|
+
@thread = @comment.thread
|
20
|
+
@creator = @comment.creator
|
21
|
+
|
22
|
+
@commontable = @thread.commontable
|
23
|
+
@config = @thread.config
|
24
|
+
|
25
|
+
@creator_name = commontator_name(@creator)
|
26
|
+
@comment_timestamp = @comment.timestamp
|
27
|
+
|
28
|
+
@commontable_name = commontable_name(@thread)
|
29
|
+
@commontable_id = commontable_id(@thread).to_s
|
30
|
+
|
31
|
+
@commontable_url = ApplicationController.commontable_url
|
32
|
+
|
33
|
+
params = Hash.new
|
34
|
+
params[:comment] = @comment
|
35
|
+
params[:thread] = @thread
|
36
|
+
params[:creator] = @creator
|
37
|
+
params[:commontable] = @commontable
|
38
|
+
params[:config] = @config
|
39
|
+
params[:creator_name] = @creator_name
|
40
|
+
params[:comment_timestamp] = @comment_timestamp
|
41
|
+
params[:commontable_name] = @commontable_name
|
42
|
+
params[:commontable_id] = @commontable_id
|
43
|
+
params[:commontable_url] = @commontable_url
|
44
|
+
|
45
|
+
@bcc = recipients.collect{|s| commontator_email(s)}
|
46
|
+
@from = @config.subscription_email_from_proc.call(params)
|
47
|
+
@subject = @config.subscription_email_subject_proc.call(params)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -2,16 +2,14 @@ module Commontator
|
|
2
2
|
class Comment < ActiveRecord::Base
|
3
3
|
belongs_to :creator, :polymorphic => true
|
4
4
|
belongs_to :editor, :polymorphic => true
|
5
|
-
|
6
5
|
belongs_to :thread
|
7
6
|
|
8
7
|
has_one :commontable, :through => :thread
|
9
8
|
|
10
|
-
attr_accessible :body
|
9
|
+
attr_accessible :body if respond_to?(:attr_accessible)
|
11
10
|
|
12
11
|
validates_presence_of :creator, :on => :create
|
13
12
|
validates_presence_of :editor, :on => :update
|
14
|
-
|
15
13
|
validates_presence_of :thread
|
16
14
|
validates_presence_of :body
|
17
15
|
|
@@ -60,7 +58,7 @@ module Commontator
|
|
60
58
|
|
61
59
|
def timestamp
|
62
60
|
config = thread.config
|
63
|
-
"#{config.comment_create_verb_past.capitalize} on "
|
61
|
+
"#{config.comment_create_verb_past.capitalize} on " + \
|
64
62
|
created_at.strftime(config.timestamp_format) + \
|
65
63
|
(is_modified? ? " | Last #{config.comment_edit_verb_past} on " + \
|
66
64
|
updated_at.strftime(config.timestamp_format) : '')
|
@@ -103,6 +101,4 @@ module Commontator
|
|
103
101
|
can_be_voted_on? && thread.can_be_read_by?(user) && user != creator
|
104
102
|
end
|
105
103
|
end
|
106
|
-
|
107
|
-
CommentObserver.instance
|
108
104
|
end
|
@@ -4,18 +4,15 @@ module Commontator
|
|
4
4
|
|
5
5
|
belongs_to :thread
|
6
6
|
|
7
|
-
attr_accessible :subscriber, :thread
|
8
|
-
|
9
7
|
validates_presence_of :subscriber, :thread
|
10
|
-
|
11
8
|
validates_uniqueness_of :thread_id, :scope => [:subscriber_type, :subscriber_id]
|
12
9
|
|
13
10
|
def mark_as_read
|
14
|
-
|
11
|
+
update_attribute(:unread, 0)
|
15
12
|
end
|
16
13
|
|
17
14
|
def add_unread
|
18
|
-
|
15
|
+
update_attribute(:unread, unread + 1)
|
19
16
|
end
|
20
17
|
end
|
21
18
|
end
|
@@ -1,17 +1,12 @@
|
|
1
1
|
module Commontator
|
2
2
|
class Thread < ActiveRecord::Base
|
3
3
|
belongs_to :closer, :polymorphic => true
|
4
|
-
|
5
4
|
belongs_to :commontable, :polymorphic => true
|
6
5
|
|
7
6
|
has_many :comments, :dependent => :destroy
|
8
|
-
|
9
7
|
has_many :subscriptions, :dependent => :destroy
|
10
8
|
|
11
|
-
attr_accessible :is_closed
|
12
|
-
|
13
9
|
validates_presence_of :commontable, :unless => :is_closed?
|
14
|
-
|
15
10
|
validates_uniqueness_of :commontable_id, :scope => :commontable_type, :allow_nil => true
|
16
11
|
|
17
12
|
def config
|
@@ -28,6 +23,7 @@ module Commontator
|
|
28
23
|
end
|
29
24
|
|
30
25
|
def subscribers
|
26
|
+
subscriptions.collect{|s| s.subscriber}
|
31
27
|
end
|
32
28
|
|
33
29
|
def active_subscribers
|
@@ -45,8 +41,10 @@ module Commontator
|
|
45
41
|
|
46
42
|
def subscribe(subscriber)
|
47
43
|
return false if is_subscribed?(subscriber) || !subscriber.is_commontator
|
48
|
-
subscription = Subscription.
|
49
|
-
|
44
|
+
subscription = Subscription.new
|
45
|
+
subscription.subscriber = subscriber
|
46
|
+
subscription.thread => self
|
47
|
+
subscription.save
|
50
48
|
end
|
51
49
|
|
52
50
|
def unsubscribe(subscriber)
|
@@ -0,0 +1,30 @@
|
|
1
|
+
<% # Clients of this partial must supply the following variables:
|
2
|
+
# comment
|
3
|
+
# user
|
4
|
+
%>
|
5
|
+
|
6
|
+
<% can_edit = comment.can_be_edited_by?(user)
|
7
|
+
can_delete = comment.can_be_deleted_by?(user) %>
|
8
|
+
|
9
|
+
<% if can_edit %>
|
10
|
+
<%= link_to 'Edit', commontator.edit_comment_path(comment),
|
11
|
+
:id => "comment_#{comment.id.to_s}_edit_link",
|
12
|
+
:class => "comment_edit_link",
|
13
|
+
:remote => true %>
|
14
|
+
<% end %>
|
15
|
+
|
16
|
+
|
17
|
+
|
18
|
+
<% if can_delete %>
|
19
|
+
<% is_deleted = comment.is_deleted? %>
|
20
|
+
<% del_string = is_deleted ? "undelete" : "delete" %>
|
21
|
+
<%= link_to del_string.capitalize,
|
22
|
+
commontator.polymorphic_path([del_string, comment]),
|
23
|
+
:confirm => (!is_deleted ? \
|
24
|
+
"Are you sure you want to delete this " + \
|
25
|
+
"#{comment.thread.config.comment_name}?" : nil),
|
26
|
+
:method => :put,
|
27
|
+
:id => "comment_#{comment.id.to_s}_#{del_string}_link",
|
28
|
+
:class => "comment_#{del_string}_link",
|
29
|
+
:remote => true %>
|
30
|
+
<% end %>
|
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
<% if comment.can_be_voted_on? %>
|
7
7
|
<% can_vote = comment.can_be_voted_on_by?(user) %>
|
8
|
-
<% vote = comment.
|
8
|
+
<% vote = comment.get_vote_by(user) %>
|
9
9
|
|
10
10
|
<span id="comment_<%= comment.id %>_upvote_span" class="comment_upvote">
|
11
11
|
<% if can_vote && (vote.blank? || !vote.vote_flag) %>
|
@@ -0,0 +1,20 @@
|
|
1
|
+
<% # Clients of this partial must supply the following variables:
|
2
|
+
# thread
|
3
|
+
# user
|
4
|
+
%>
|
5
|
+
|
6
|
+
<% subscription = thread.subscription_for(user) %>
|
7
|
+
|
8
|
+
<% if thread.can_be_read_by?(user) %>
|
9
|
+
<%= stylesheet_link_tag "commontator/application.CSS", :media => "all" %>
|
10
|
+
|
11
|
+
<div id="thread_<%= thread.id %>_div" class="thread" style="display: none;">
|
12
|
+
<% if @commontator_thread_show %>
|
13
|
+
<%= render :partial => 'commontator/threads/show', :locals => {:thread => thread,
|
14
|
+
:user => user} %>
|
15
|
+
<% else %>
|
16
|
+
<%= link_to "Show #{thread.config.comment_name.pluralize} (#{subscription ? subscription.unread + '/' + thread.comments.count : thread.comments.count})", \
|
17
|
+
commontator.thread_path(thread), :remote => true %>
|
18
|
+
<% end %>
|
19
|
+
</div>
|
20
|
+
<% end %>
|
@@ -0,0 +1,16 @@
|
|
1
|
+
<% # Clients of this partial must supply the following variable:
|
2
|
+
# thread
|
3
|
+
# user
|
4
|
+
%>
|
5
|
+
|
6
|
+
<% is_subscribed = thread.is_subscribed?(user) %>
|
7
|
+
<% sub_string = is_subscribed ? "unsubscribe" : "subscribe" %>
|
8
|
+
<%= link_to sub_string.capitalize,
|
9
|
+
commontator.polymorphic_path([sub_string, thread]),
|
10
|
+
:confirm => (is_subscribed ? \
|
11
|
+
"Are you sure you want to unsubscribe from this thread?" : \
|
12
|
+
nil),
|
13
|
+
:method => :put,
|
14
|
+
:id => "thread_#{thread.id.to_s}_#{sub_string}_link",
|
15
|
+
:class => "thread_#{sub_string}_link",
|
16
|
+
:remote => true %>
|