Johan Donado B.
Johan Donado B.

Reputation: 285

Error not displaying with form_with

Good Morning.

I'm following the tutorial http://edgeguides.rubyonrails.org/getting_started.html and I find the following:

I have a controller called ArticlesController. The create method uses the "if @ article.save" statement to save the @article object, and if something goes wrong then render 'new'. Similarly the update method uses "if @article.update (article_params)" to update the record for that article, and if something goes wrong render 'edit'.

In new and edit views <% if @ article.errors.any? %> is used to determine if there was any error and display the corresponding message, but the problem is that in the new view works fine, but in the edit view @article.errors.any view? returns false even if there is an error.

Can someone tell me what's wrong. Thank you very much.

Then I put the ArticlesController class, the views new.html.erb and edit.html.erb, and the article model.


class ArticlesController < ApplicationController
  def new
    @article = Article.new
  end

  def edit
    @article = Article.find(params[:id])
  end

  def update
    @article = Article.find(params[:id])

    if @article.update(article_params)
      redirect_to @article
    else
      render 'edit'
    end
  end

  def index
    @articles = Article.all
  end

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

  def create
    @article = Article.new(article_params)

    if @article.save
      redirect_to @article
    else
      render 'new'
    end
  end

  private

  def article_params
    params.require(:article).permit(:title, :text)
  end
end

    ------------------------------------------------------------------

    <h1>New Article</h1>

    <%= form_with scope: :article, url: articles_path, local: true do |form| %>

      <% if @article.errors.any? %>
        <div id="error_explanation">
          <h2>
            <%= pluralize(@article.errors.count, "error") %> prohibited
            this article from being saved:
          </h2>
          <ul>
            <% @article.errors.full_messages.each do |msg| %>
              <li><%= msg %></li>
            <% end %>
          </ul>
        </div>
      <% end %>

      <p>
        <%= form.label :title %><br>
        <%= form.text_field :title %>
      </p>

      <p>
        <%= form.label :text %><br>
        <%= form.text_area :text %>
      </p>

      <p>
        <%= form.submit %>
      </p>
    <% end %>
    <%= link_to 'Back', articles_path %>

    ----------------------------------------------------------------------

    <h1>Edit article</h1>

    <%= form_with(model: @article) do |form| %>

      <% if @article.errors.any? %>
        <div id="error_explanation">
          <h2>
            <%= pluralize(@article.errors.count, "error") %> prohibited
            this article from being saved:
          </h2>
          <ul>
            <% @article.errors.full_messages.each do |msg| %>
              <li><%= msg %></li>
            <% end %>
          </ul>
        </div>
      <% end %>

      <p>
        <%= form.label :title %><br>
        <%= form.text_field :title %>
      </p>

      <p>
        <%= form.label :text %><br>
        <%= form.text_area :text %>
      </p>

      <p>
        <%= form.submit %>
      </p>

    <% end %>

    <%= link_to 'Back', articles_path %>

    ---------------------------------------------------------------------

    class Article < ApplicationRecord
        validates :title, presence: true,
                        length: { minimum: 5 }
        validates :text, presence: true
    end

Upvotes: 3

Views: 3620

Answers (3)

tcgumus
tcgumus

Reputation: 328

Got the same error today. They are using render with form_with in their documentation but it doesn't work.

I used form_for and it fixed the problem.

<%= form_for article do |form| %>

Upvotes: 0

user1322092
user1322092

Reputation: 4270

It's a limitation of Turbolinks, which does not work with render See here https://joey.io/turbolinks-rendering-form-errors/ and here https://github.com/jorgemanrubia/turbolinks_render

Upvotes: 1

Snake
Snake

Reputation: 1197

All forms generated by form_with will be submitted by an XHR (Ajax) request by default. if you want to disable remote forms then you can do it with local like you did in the form in new.html.erb. change this in your edit.html.erb :

<%= form_with model: @article, local: true do |form| %>

Upvotes: 3

Related Questions