Есть ли чистый подход для реализации acts_as_commentable в приложении Rails? - PullRequest
11 голосов
/ 18 сентября 2010

README не показывает, как обращаться с контроллером, и не рассматривает аспекты настройки этого плагина.Я искал пару часов и не могу найти ничего, что показывает, как использовать этот плагин.

Ответы [ 3 ]

18 голосов
/ 19 сентября 2010

После еще большего поиска я отказался от поиска учебника и придумал это. Если кто-нибудь может указать лучший / более чистый способ сделать это, пожалуйста, дайте мне знать. В противном случае, вот что я использую сейчас на случай, если это пойдет на пользу кому-либо еще.

Сначала установите плагин с помощью 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 при визуализации формы комментариев, и тот же код контроллера / представления комментариев должен работать.

7 голосов
/ 18 сентября 2010

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 сейчас.

2 голосов
/ 15 сентября 2011

Я думаю, что лучший способ добавить комментарии к любой модели - это создать метод под названием 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>

Надеюсь, это кому-нибудь пригодится ...

...