

## やりたいこと

掲示板：コメントが１対多のような関係で、以下のような掲示板で、コメント欄が空白のまま投稿しようとすると、バリデーションエラーメッセージを表示したい。

[![画像の説明をここに入力](https://i.stack.imgur.com/kck8g.png)](https://i.stack.imgur.com/kck8g.png)

## 設定

親モデル（Board）  
カラム：title  
has_many :comments, dependent: :destroy

子モデル(Comment)  
カラム  
board_id ##外部キー  
user_name  
content

belongs_to :board  
validates :content, presence: true

view

[code]

    %h2= t '.title'
      = link_to "#{t '.back_to_index'}", boards_path
      .thread-title
        = @board.title
      %hr
      - @comments.each_with_index do |comment, i|
        .field
          = "#{i+1}"
          = ":"
          = comment.user_name
          = comment.created_at.strftime("%Y-%m-%d %H:%M:%S")
          - if current_user.id == comment.user_id
            = link_to "#{t '.edit'}", edit_comment_path(comment)
            = link_to "#{t '.delete'}", comment_path(comment), method: :delete
        .field
          = comment.content
        %hr
    = form_for([@board, @comment]) do |f|
      = render 'shared/errors', object: @comment
      .field
        = f.label :"#{t '.content'}"
        = f.text_area :content, rows: "5", class: "form-control"
        = f.hidden_field :user_name, value:current_user.name
        = f.hidden_field :board_id
      .button-field
        = f.submit "#{t '.create_comment'}", class: "btn btn-primary"
    
[/code]

メッセージ表示view

[code]

    - if object.errors.any?
      #error_explanation.alert.alert-danger
        %ul
        - object.errors.full_messages.each do |msg|
          %li= msg
    
[/code]

## 質問

Commentモデルのcontentカラムにバリデーションをかけただけだと何も反応しませんでした。  
メッセージ表示に渡すオブジェクトは、@commentでいいのかというのも疑問です。  
この場合、バリデーションでメッセージを表示するには、どのような設定が必要でしょうか。


CC BY-SA 3.0
2018-03-28T04:46:55.663
42695
2018-03-28T14:04:22.723
25446
question
ruby-on-rails
rails ネストした子モデルのバリデーションの方法


[validates_associated](http://api.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html#method-
i-validates_associated) ですかね。

[code]

    class Board < ApplicationRecord
      has_many :comments, dependent: :destroy
      validates :comments, associated: true
    end
    
    class Comment < ApplicationRecord
      belongs_to :board
      validates :content, presence: true
    end
    
[/code]

で、 rails console でこんな感じになりますね。

[code]

    >> b = Board.create(title: 'test')
    >> b.valid?
    => true # コメントがない状態なので
    >> b.comments.create(user_name: 'anonymous') # create なので valid ならセーブされるはず
    >> b.comments.first.new_record?
    => true # セーブされてない
    >> Comment.count
    => 0
    >> b.valid?
    => false # comment が valid ではないため
    
[/code]

同じようになるのにフォーム経由だとそうならないなら、フォーム/コントローラでの処理を確認してみてはいかがでしょうか。


CC BY-SA 3.0
2018-03-28T08:41:17.737
42707
2018-03-28T14:04:22.723
2018-03-28T14:04:22.723
17037
17037
42695
answer