使用form_with显示错误

时间:2017-09-21 13:02:20

标签: ruby-on-rails

早上好。

我正在关注教程http://edgeguides.rubyonrails.org/getting_started.html,我发现以下内容:

我有一个名为ArticlesController的控制器。 create方法使用“if @ article.save”语句来保存@article对象,如果出现问题,则渲染“new”。类似地,更新方法使用“if @ article.update(article_params)”来更新该文章的记录,如果出现问题则渲染“编辑”。

在新视图和编辑视图中<%if @ article.errors.any? %GT;用于确定是否有任何错误并显示相应的消息,但问题是在新视图中工作正常,但在编辑视图中@ article.errors.any视图?即使出现错误也会返回false。

有人能告诉我什么是错的。非常感谢你。

然后我把ArticlesController类,视图new.html.erb和edit.html.erb以及文章模型。

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

3 个答案:

答案 0 :(得分:2)

默认情况下,form_with生成的所有表单都将由XHR(Ajax)请求提交。如果要禁用远程表单,则可以像在new.html.erb中的表单中那样使用本地操作。    在edit.html.erb中更改此内容:

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

答案 1 :(得分:1)

这是Turbolink的限制,不适用于render 在此处https://joey.io/turbolinks-rendering-form-errors/和此处https://github.com/jorgemanrubia/turbolinks_render

答案 2 :(得分:0)

今天遇到了同样的错误。他们在他们的文档中使用了带有 form_with 的渲染,但它不起作用。

我使用了 form_for 并解决了这个问题。

<%= form_for article do |form| %>