質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.45%

  • Ruby on Rails

    9097questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

rails5でユーザと記事に紐付いたコメント(画像付き)を作りたい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 875

keico

score 1

現在Bloggerのような機能をRailsで作成しています。
ユーザは複数のコメントを持ち、記事にコメントをつけます。(Article)
複数のコメントは一人のユーザーに帰属し、コメントも1つのユーザーに帰属するという関係です。(Comment)
また、コメントにはCarrierWaveで格納した画像を紐付けています。(CommentImage)

+ comment.rb

class Comment < ApplicationRecord
  belongs_to :user
  belongs_to :article
  has_many :comment_images
  accepts_nested_attributes_for :comment_images

  default_scope -> { order(created_at: :desc) }
  validates :user_id, presence: true
  validates :article_id, presence: true
end

+ comment_image.rb

class CommentImage < ApplicationRecord
  belongs_to :comment
  mount_uploader :image, ThumbnailUploader
end


エラーが発生しているのは、コメントを実際に投稿しようと思うと、なぜかうまくいかないのです。エラー表示はありませんが、コメントがうまく保存されず「コメントの投稿に失敗しました」というアラートが出てしまいます。

+ comment_controller.rb

class CommentsController < ApplicationController
  def create
   @comment = current_user.comments.create(create_params)
   if @comment.save
     flash[:success] = "コメントが投稿されました!"
     redirect_to root_path
   else
     flash[:alert] = "コメントの投稿に失敗しました。"
     redirect_to root_path
   end
 end

 def show
   @comment = comment.find(params[:id])
 end

 def new
   @comment = Comment.new
   @comment.images.new
 end

 def destroy
   @comment.destroy
   flash[:success] = "コメントが削除されました"
   redirect_to request.referrer || root_url
 end

 def edit
 end

 def update
 end

 private

 def create_params
   params.require(:comment).permit(:id, :content, :title, :article_id, :user_id, comment_images_attributes: [:image])
 end

 def correct_user
   @comment = current_user.comments.find_by(id: params[:id])
   redirect_to root_url if @comment.nil?
 end
end

ビューの表示は、comment/newではなく、articles/show内で行っています。

    <%= form_for(@comment) do |f| %>
        <%= f.hidden_field :article_id, value: @article.id %>
          <!-- ここにコメントの内容が入ります -->
            <label>コメントを入力</label>
            <%= f.text_area :content, placeholder: "コメント内容", rows: "5" %>
            <label>画像を投稿</label>
            <!-- ここに写真添付が入ります -->
            <%= f.fields_for :images do |comment_image| %>
              <%= comment_image.file_field :image %>
            <% end %>
        </div>
        <%= f.submit "投稿する" %>

*articles_controllerを下記に追記します。

class ArticlesController < ApplicationController
  before_action :set_article

  def show
    @comment = current_user.comments.build if signed_in?
  end

  private

  def set_article
    @article = Article.find(params[:id])
    @comment = Comment.new
    @comment.comment_images.new
  end
end
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

エラーメッセージはterminal等に表示されると思いますが…。

とりあえず、commentに紐づいているのは imagesではなくcomment_images なので
f.fields_for :imagesではなく、f.fields_for :comment_imagesだと思います。

  <%= form_for(@comment) do |f| %>
        <%= f.hidden_field :article_id, value: @article.id %>
          <!-- ここにコメントの内容が入ります -->
            <label>コメントを入力</label>
            <%= f.text_area :content, placeholder: "コメント内容", rows: "5" %>
            <label>画像を投稿</label>
            <!-- ここに写真添付が入ります -->
            <%= f.fields_for :comment_images do |comment_image| %>
              <%= comment_image.file_field :image %>
            <% end %>
        </div>
        <%= f.submit "投稿する" %>

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/07/03 14:04

    ありがとうございます。
    おかげさまで、コメント登録はできました。

    > とりあえず、commentに紐づいているのは imagesではなくcomment_images なので
    > f.fields_for :imagesではなく、f.fields_for :comment_imagesだと思います。

    上記通りにやってみたのですが、これまで出ていた[ファイルを選択する]が消えてしまいます...。
    そのままでおこなうと、画像は選択できて、「コメント成功!」と出るのですが保存はできていないという状態になります。

    キャンセル

  • 2017/07/03 14:17 編集

    そうするとarticles_controller.rbの記述が間違っているのではないでしょうか?
    articles_controller.rbを見せてください。
    comment.images.build
    or
    comment.images.new

    comment.comment_images.build
    or
    comment.comment_images.new
    に変えればいいだけだと思いますが

    キャンセル

  • 2017/07/04 09:28

    ありがとうございます。
    下記が、articles_controllerとなります。

    class ArticlesController < ApplicationController
    before_action :set_article

    def show
    @comment = current_user.comments.build if signed_in?
    end

    private

    def set_article
    @article = Article.find(params[:id])
    @comment = Comment.new
    @comment.comment_images.new
    end
    end

    キャンセル

  • 2017/07/04 09:31

    ターミナルでは下記のエラーが出ています。

    Unpermitted parameter: images

    キャンセル

  • 2017/07/04 09:51

    @comment = current_user.comments.build if signed_in?
    で、set_articleでせっかく作成したcomment_images付きの@commentを上書きしてますね
    def show
    if signed_in?
    @comment = current_user.comments.build
    @comment.comment_images.build
    end
    end
    private
    def set_article
    @article = Article.find(params[:id])
    end
    としてみてはいかがでしょう?

    キャンセル

  • 2017/07/04 14:06

    ありがとうございます。
    問題なく通りました。before_actioinの後に上書き作業をしてしまっていたのですね。
    非常に助かりました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.45%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Ruby on Rails

    9097questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。