Встраивание формы без нарушения встроенной проверки рельсов - PullRequest
0 голосов
/ 27 апреля 2019

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

IE: views / blog / index.html.erb

# blog here...
<%= render partial: 'comments/form', locals: { comment: Comment.new } %>
<%= render @comments %>

controllers / comments_controller.rb

def create
  @comment = Comment.new(comment_params)

  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
...

views / comment / _form.html.erb

<%= bootstrap_form_with(model: comment, local: true) do |form| %>
  <%= form.text_area :message, rows: 5 %>
  <%= form.submit class: 'btn btn-secondary float-right' %>
<% end %>

Это работает, однако проверка формы не работает независимо от того, как я настраиваю форму.

Способы, которыми я пытался настроить форму:

Решение 1

<%= form_with(model: comment, local: false) do |form| %>

Это решение работает, однако родные рельсы прерывают проверку формы и не будут отображать ошибки проверки.

Решение 2

<%= form_with(model: comment, format: 'json') do |form| %>

Еще раз проверка формы не работает и потребует, чтобы я сам подключил ее в javascript (я бы предпочел использовать rails из коробки)1024 *

Решение 3:

<%= form_with(model: comment, local: true) do |form| %>

Это работает, однако он перенаправляет меня с исходной страницы на / comments / new, когда возникает проблема с проверкой (и успешно проверяет ее там).

Я нахожу большую выгоду в том, чтобы делать вещи «рельсовым путем».Мой вопрос заключается в том, как официальный путь rails для встраивания формы для ресурса в другое представление ресурсов и получения хорошей встроенной проверки rails?

Как официальный способ rails справляется с этим?

Ответы [ 2 ]

2 голосов
/ 27 апреля 2019

Проверка для режима local:true не работает, потому что вы каждый раз передаете в форму новый пустой объект. Вам необходимо передать объект, который только что не удалось сохранить (и, следовательно, errors установлен).

'Rails-way' - это простой CRUD, где у вас есть форма, отрисованная и обработанная одним и тем же контроллером, и когда вы уже разбили ее на разделяемую форму (ваш контроллер комментариев, очевидно, не знает, как отобразить страницу, на которой изначально была форма ), Я бы сделал это в javascript (или с удаленной формой).

Для последнего - убедитесь, что вы правильно отображаете сообщения об ошибках в комментарии create action

0 голосов
/ 27 апреля 2019

Как говорит @Vasfed, вы нарушаете Rails-way , поэтому вам нужно больше работать на вашем контроллере:

def index
  @comment = Comment.new # You need this to remove it from the partial render
  @comments = Comments.all
end

def create
  @comment = Comment.new(comment_params)

  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 do
        @comments = Comments.all # DRY this with a private method and use it in index
        render :index
      end
      format.json { render json: @comment.errors, status: :unprocessable_entity }
    end
end

По вашему мнению, вам не нужно устанавливать locals[:comment], так как вы можете использовать @comment прямо в форме, но вы можете оставить его, если хотите:

<%= render 'comments/form', comment: @comment %>
<%= render @comments %>

Извините, если я (вероятно) что-то забуду. Я не проверял это.

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