6

コメント可能にしたいモデルがあります。モデルの「表示」ビューで、コメントを作成できるフォームを作成するのに苦労しています。良い例や有用な例が見つかりません。誰かが私にこれを行う方法の例を教えてくれますか?

例:

シンプルなブログアプリ。Postというモデルがあります。コメント可能です。したがって、「表示」ビューで投稿を表示し、下部に、入力して送信すると、投稿に関連付けられた新しいコメントを作成してデータベースに入れるフィールドを用意します。

簡単に聞こえますが、シードしたコメントを表示できるように動作しています。新しいものを入れるためのフォームが機能しません。どんな助けも大歓迎です。

4

3 に答える 3

28

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

そしてroutes.rbで

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

これでうまくいくことを願っています。

于 2010-11-02T23:06:48.187 に答える
3

これは非常に基本的なことであり、より良い構造と学習へのアプローチが明らかに必要です。Agile Web Development with 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
于 2010-11-02T23:51:24.717 に答える
2

これは古い質問ですが、私の解決策を投入したいと思います。gem の README は何年も経ってもまだ役に立ちません。@ Kundayの回答に基づいています。以下は、act_as_commentable gem を使用して...

  1. ユーザーが各投稿の下にコメントを作成できるようにします。
  2. 投稿に属するすべてのコメントを表示します。

これは、写真であろうと投稿であろうと、すでに機能する「ブログ」があることを前提としています。gem をインストールし、実行rails g commentして開始します。

ユーザーが各投稿の下にコメントを作成できるようにします。

まず、コメント可能な gem を使用するモデル内に、gem の README で提案されているように次の行を追加します。

class Post < ActiveRecord::Base 
  acts_as_commentable
end

次に、アクションを含む新しいコメント コントローラーを作成しますcreate:authenticate_user!は、簡単な認証を作成するための gem である devise の一部であることに注意してください。current_userヘルパーとしてのdeviseの一部でもあります。コメント本文の下にユーザー名/メールアドレスを表示したい場合に必要です。

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 の show ビューにフォームを追加します。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 を追加するのに役立ちます。Usercomment.user.nameクラスに名前列がある場合に機能します。emailそれ以外の場合は、または使用することを選択した任意の識別子に変更します。

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

最後に、@comments が show ページに存在するようにするには、Post コントローラーに移動し、show の下に次を追加します。

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

これは要件に適しているはずです。幸運を。

于 2016-06-08T23:21:53.710 に答える