act_as_commentable примеры? - PullRequest
       19

act_as_commentable примеры?

5 голосов
/ 03 ноября 2010

У меня есть модель, которую я хочу комментировать. У меня возникают трудности при создании формы в представлении моей модели, которая позволяет создавать комментарии. Я не нахожу хороших или полезных примеров. Кто-нибудь может указать мне или показать пример того, как это сделать?

Пример:

Простое приложение для блога. У меня есть модель под названием Post. Это комментируется. Поэтому в представлении «показать» я хочу показать сообщение и в нижней части иметь поля, которые после заполнения и отправки создают новый комментарий, связанный с сообщением, и помещают его в базу данных.

Звучит просто, и у меня это работает, так что я могу отображать комментарии, которые я добавил. Я просто не могу заставить работать форму, чтобы вставлять новые. Любая помощь приветствуется.

Ответы [ 3 ]

27 голосов
/ 03 ноября 2010

Предположим, что модель Post.Убедитесь, что у вас есть

class Post < ActiveRecord::Base
acts_as_commentable
end

, а затем, скажем, Post # show

  <%= form_tag "/posts/add_new_comment" do %>
    <%= hidden_field_tag "id", post.id %>
    <%= text_area_tag "comment[comment]" %>
    <%= submit_tag "Post Comment" %>
  <% end %>

, затем в PostController

  def add_new_comment
    post = Post.find(params[:id])
    post.comments << Post.new(params[:comment])
    redirect_to :action => :show, :id => post
  end

и в rout.rb

  match "/posts/add_new_comment" => "posts#add_new_comment", :as => "add_new_comment_to_posts", :via => [:post]

Надеюсь, это поможет вам.

3 голосов
/ 03 ноября 2010

Это очень, очень элементарный материал, и вам явно нужна лучшая структура и подход к обучению.Покупка книги, такой как Agile Web Development с Rails , является единственным реальным способом обучения, в противном случае вы будете переходить от проблемы к проблеме, даже не научившись чему-либо хорошему.

Скажем, у вас есть сообщение, которое вы хотите прокомментировать.

#routes.rb
map.resources :posts do |post|
  post.resources :comments
end

#post_controller.rb
def show
  @post.find params[:id]
  @comment = @post.comments.new
end

#posts/show.html.erb
<%- form_for [@post, @comment] do |f|-%>
  <%= f.text_area :body -%>
  <%= f.submit -%>
<%- end -%>

#comments_controller
def create
  @post = @post.find params[:post_id]
  @comment = @post.comments.new params[:comment]
  if @comment.save
    redirect_to @post
1 голос
/ 09 июня 2016

Это старый вопрос, но я хочу добавить свое решение, так как README драгоценного камня все еще бесполезен после всех этих лет. Он основан на ответе @ Kunday. Ниже приведено руководство по использованию гем act_as_commentable для ...

  1. Разрешить пользователям создавать комментарии под каждым сообщением.
  2. Показать все комментарии, относящиеся к записи.

Это предполагает, что у вас уже есть работающий «блог», будь то картинки или посты. Установите gem, затем запустите rails g comment, чтобы начать.

Разрешить пользователям создавать комментарии под каждым сообщением.

Во-первых, внутри модели, в которой вы хотите использовать комментируемый камень, добавьте следующую строку, как предложено в README для камня.

class Post < ActiveRecord::Base 
  acts_as_commentable
end

Затем создайте новый контроллер комментариев с действием create. Обратите внимание, что :authenticate_user! является частью устройства, которое является жемчужиной для создания простой аутентификации. current_user также является частью устройства в качестве помощника. Это необходимо, если вы хотите отобразить имя пользователя / адрес электронной почты под телом комментария.

class CommentsController < ApplicationController
  before_action :authenticate_user!

  def create
    post = Post.find_by(id: params[:id])
    comment = post.comments.build(comment_params)
    comment.user = current_user

    if comment.save
      flash[:notice] = "Comment has been created."
      redirect_to post
    else
      flash[:alert] = "Comment has not been created."
    end
  end

  private    
    def comment_params
      params.permit(:comment)
    end
end

Далее настройте маршруты. Это просто так. Это означает, что когда кто-то отправляет запрос на публикацию комментариев, мы запускаем действие внутри контроллера комментариев.

post 'comments' => 'comments#create', as: "create_comment"

as: "create_comment" дает ему псевдоним, так что вы можете сделать create_comment_path. Теперь, в представлении Post, мы добавим форму. Div поможет вам добавить CSS.

<div class="comment-section">
  <%= form_tag create_comment_path, method: "post" do %>
    <%= hidden_field_tag "id", @post.id %>
      <%= text_area_tag :comment %>
      <%= submit_tag "Submit" %>
    <% end %>
</div>

Теперь показывать каждый комментарий в представлении Post show.

div поможет вам добавить css, comment.user.name будет работать, если у вашего класса User есть столбец имени. В противном случае измените его на email или любой другой идентификатор, который вы выберете для использования.

<div class="comment_list">
  <% @comments.each do |comment| %>
    <%= comment.comment %> <br>
      <%= comment.user.name %> <br>
        <br>
    <% end %>
</div>

И, наконец, чтобы @comments существовали на странице шоу, перейдите к контроллеру Post и в разделе show добавьте следующее:

  def show
    @post = Post.find_by(id: params[:id])
    @comments = @post.comments.all
  end

Это должно быть хорошо для требований. Удачи.

...