Есть ли чистый подход для реализации acts_as_commentable в приложении Rails?
В README не показано, как обращаться с контроллером, а также рассматриваются аспекты настройки этого плагина. Я искал пару часов и не могу найти ничего, что показывает, как использовать этот плагин.
3 ответа
После еще большего поиска я отказался от поиска учебника и придумал это. Если кто-нибудь может указать лучший / более чистый способ сделать это, пожалуйста, дайте мне знать. В противном случае, вот что я использую сейчас на случай, если это пойдет на пользу кому-то еще.
Сначала установите плагин с script/plugin install http://github.com/jackdempsey/acts_as_commentable.git -r 2.x
Затем сгенерируйте модель комментария и выполните миграцию с script/generate comment
и перенести базу данных с rake db:migrate
Хитрый момент - это полимеризация вложенных комментариев под другими ресурсами. Вот что я сделал:
# In config/routes.rb
map.resources :comments, :path_prefix => '/:commentable_type/:commentable_id'
# In app/controllers/comments_controller.rb
before_filter :load_commentable
def create
@comment = @commentable.comments.build(params[:comment])
@comment.user = current_user
respond_to do |format|
if @comment.save
format.html { redirect_to @commentable }
else
format.html { render :action => 'new' }
end
end
end
protected
def load_commentable
@commentable = params[:commentable_type].camelize.constantize.find(params[:commentable_id])
end
# In app/views/comments/_form.html.erb
<%= form_for(:comment, :url => comments_path(commentable.class.to_s.underscore, commentable.id)) do |f| %>
# In app/views/model_that_allows_comments/show.html.erb
<%= render :partial => 'comments/form', :locals => {:commentable => @model_that_allows_comments} %>
Я думаю, что показывает соответствующие части достаточно ясно, чтобы понять, что происходит. Это позволяет добавить acts_as_commentable
к любой модели. Вам просто нужно передать комментируемый объект в хеш-код localals при отображении формы комментариев, и тот же код контроллера / представления комментариев должен работать.
acts_as_commentable
просто предоставляет вам модель Comment и заботится о том, чтобы установить связь между этой моделью и вашими поддающимися оценке моделями. Это не дает вам никаких контроллеров или представлений. Вы несете ответственность за решение, как вы хотите реализовать эту часть вашего приложения.
Это довольно просто, хотя. Например...
# in routes.rb
map.resources :posts, :has_many => :comments
# in your comments controller...
class CommentsController < ApplicationController
before_filter :get_post
def get_post
@post = Post.find(params[:post_id])
end
def index
@comments = @post.comments.all # or sorted by date, or paginated, etc.
end
end
# In your haml view...
%h1== Comments for #{@post.title}:
%ul
- comments.each do |comment|
%h3= comment.title
%p= comment.comment
Вы увидите комментарии к конкретному сообщению, когда перейдете на /posts/1/comments
сейчас.
Я думаю, что лучший способ добавить комментарии к любой модели - это создать метод под названием comment в вашем файле ApplicationController.rb, подобный этому.
def comment
# Extracts the name of the class
klass = self.class.to_s[/\A(\w+)sController\Z/,1]
# Evaluates the class and gets the current object of that class
@comentable_class = eval "#{klass}.find(params[:id])"
# Creates a comment using the data of the form
comment = Comment.new(params[:comment])
# Adds the comment to that instance of the class
@comentable_class.add_comment(comment)
flash[:notice] = "Your comment has been added!"
redirect_to :action => "show", :id => params[:id]
end
а затем просто создайте частичный _comment.rb, чтобы использовать его в любой модели, которую вы хотите
<%= form_tag :action => "comment", :id => Your_model_goes_here %>
<p><label for="comment_title">Title</label><br/>
<%= text_field 'comment', 'title' %></p>
<%= text_area "comment", "comment", :rows => 5, :cols => 50 %> <br />
<%= submit_tag "Comment!.." %>
</form>
Надеюсь это кому-нибудь пригодится...