Параметры формы Rails не сохраняются

Я очень новичок в Ruby on Rails, и я борюсь со своим контроллером лесов. Я сделал вложенный ресурс, где мои комментарии размещаются в постах.

class Post < ActiveRecord::Base
  validates :name,  :presence => true
  validates :title, :presence => true, :length => { :minimum => 5 }
  has_many :comments
end

class Comment < ActiveRecord::Base
  validates :commenter, :presence => true
  validates :body, :presence => true     
  belongs_to :post
end

Упрощенная версия контроллера

class CommentsController < ApplicationController
  before_action :set_comment, only: [:show, :edit, :update, :destroy]

  # omited new, index, show... 

  # POST /comments
  # POST /comments.json
  def create
    post = Post.find(params[:post_id])
    @comment = post.comments.create(params[:comment].permit(:name, :title, :context))

    respond_to do |format|
      if @comment.save
        format.html { redirect_to([@comment.post, @comment], notice: 'Comment was successfully created.') }
        format.json { render action: 'show', status: :created, location: @comment }
      else
        format.html { render action: 'new' }
        format.json { render json: @comment.errors, status: :unprocessable_entity }
      end
    end
  end

  # PATCH/PUT /comments/1
  # PATCH/PUT /comments/1.json
  def update
    post = Post.find(params[:post_id])
    @comment = post.comments.find(params[:comment])
    respond_to do |format|
      if @comment.update(comment_params)
        format.html { redirect_to @comment, notice: 'Comment was successfully updated.' }
        format.json { head :no_content }
      else
        format.html { render action: 'edit' }
        format.json { render json: @comment.errors, status: :unprocessable_entity }
      end
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_comment
      @comment = Comment.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def comment_params
      params.require(:comment).permit(:commenter, :body, :post)
    end
end

Когда я заполнил форму, я получаю это исключение:

2 ошибки препятствуют сохранению этого комментария: Комментатор не может быть пустым Тело не может быть пустым

Я попробовал это руководство, но я думаю, что оно не на 100% совместимо с Rails 4.


person PJDW    schedule 12.01.2014    source источник


Ответы (2)


Вы читаете атрибуты params для Post (:name, :title, :context), но вам нужно прочитать атрибуты Comments (:commenter, :body)

заменить это:

@comment = post.comments.create(params[:comment].permit(:name, :title, :context))

с участием

@comment = post.comments.create(params[:comment].permit(:commenter, :body))

или, что гораздо лучше, с:

@comment = post.comments.create(comment_params)

person wacko    schedule 12.01.2014

Похоже, что вы явно permitting имеете другой набор атрибутов в своем create действии.

Вы должны обновить действие create, чтобы использовать comment_params, как вы сделали в действии update. Причина в том, что ваш Comment определенно ожидает Commenter и Body, а не :name, :title, :context, который вы разрешили в своем create действии.

Обновите действие create пользователя controller следующим образом:

  # POST /comments
  # POST /comments.json
  def create
    ...
    @comment = post.comments.create(comment_params)
    ...
  end
person vee    schedule 12.01.2014
comment
Это не работает: ожидалось ActiveRecord::AssociationTypeMismatch в CommentController#create Post(#35862540), получено String(#15668268) - person PJDW; 12.01.2014
comment
Когда я изменил свои параметры в комментарии, это тоже сработало. Так что большое спасибо! - person PJDW; 12.01.2014