Пустой пост в Rails 5.2 - PullRequest
       7

Пустой пост в Rails 5.2

0 голосов
/ 27 сентября 2018

Я пытаюсь добавить вспомогательный _form моей модели комментариев в представлении рекламы.Я звоню помощнику <%= render 'comments/form', comment: @comment %> по маршруту /advertisement/:id

Так вот мои комментарии _form :

<%= form_with(model: comment, local: true,  url: "/comments") do |form| %>
  <% if comment &&  comment.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(comment.errors.count, "error") %> prohibited this comment from being saved:</h2>

      <ul>
      <% comment.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="form-group">
    <%= form.label :content %>
    <%= form.text_area :content, class:"form-field" %>
  </div>

  <%= form.hidden_field :advertisment_id, value:params[:id]  %>

  <div class="actions">
    <%= form.submit "Envoyer", class:"btn btn-primary", url: 'comments' %>
  </div>
<% end %>

Я указываю url: "/comments", потому что я 'm на /advertisment/:id, и по умолчанию действие направлено сюда.

Но когда сообщение дошло до моего контроллера комментариев, оно не может прочитать параметры.

ActionController::ParameterMissing in CommentsController#create

Странно то, что у меня есть доступ к параметрам:

{"utf8"=>"✓", "authenticity_token"=>"0+swOqHPEHN2Gwh0TO3iC7VPRz4ROLoBlkaMkOdnjjYxWHoDer7AwrgnQpu+9VHfSY90yMSRsNp8ojvPJxuzmQ==", "content"=>"Test", "advertisment_id"=>"1", "commit"=>"Envoyer"}

Итак, вот контроллер комментариев :

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

  # [...]

  # POST /comments
  # POST /comments.json
  def create
    @comment = Comment.new(comment_params.merge(:user_id => @session_user.id))

    respond_to do |format|
      if @comment.save
        format.html { redirect_to @comment, notice: 'Comment was successfully created.' }
        format.json { render :show, status: :created, location: @comment }
      else
        format.html { render :new }
        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(:content, :advertisment_id)
    end
end

Большое спасибо за вашу помощь

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Возможно, потому что ваш @comment равен nil, поэтому form_with работает как старый form_tag помощник.

Используя form_with, поле наподобие <%= form.text_field :content %>

  • Если ваша модель представлена, она сгенерирует <input type="text" name="comment[content]" />
  • Если ваша модель не представлена, она сгенерирует <input type="text" name="content" />

Во втором случаеВаша сильная проверка параметров отклонит обнаженные параметры

Чтобы решить эту проблему, просто назначьте действительную модель для вашего render

<%= render 'comments/form', comment: Comment.new %>
0 голосов
/ 27 сентября 2018

Согласно документации здесь , если вы укажете параметр url в form_with без параметра scope, полученные параметры будут отсутствовать в имени prefixes.Поэтому

params.require(:comment).permit(:content, :advertisment_id)

вызовет ошибку, так как параметры не включают comment.

Вам следует удалить опцию url в вашем form_with или использовать url и scope варианты одновременно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...