Ruby on Rails表单错误未显示

时间:2018-07-12 13:34:08

标签: ruby-on-rails ruby

我是Ruby和Rails的新手,如果这很简单,我深表歉意-

我正在创建一个基本应用,以创建和存储要练习的食谱,并且在我的表单下似乎看不到错误,这是我下面的简单示例-

recipes_controller.rb(相关部分)

def new
  @recipe = Recipe.new
end

def create
  @recipe = Recipe.new(recipe_params)
  @recipe.save
  redirect_to '/create_recipe'
end

private  
def recipe_params
  params.require(:recipe).permit(:title, :description)
end

recipe.rb(模型)

class Recipe < ApplicationRecord
    has_many :ingredients
    has_many :steps

    validates_presence_of :title
end

new.html.erb

<%= form_for @recipe do |f| %>
    <div class="new_recipe_form">

      <% if @recipe.errors.any? %>
        <div class="form_error">
          <ul>
            <% @recipe.errors.full_messages.each do |msg| %>
              <li><%='Error: ' +  msg %></li>
            <% end %>
          </ul>
        </div>
      <% end %>

      <%= f.label :title %>
      <%= f.text_field :title %>

      <%= f.label :description %>
      <%= f.text_area :description %>

    </div>

    <div>
      <%= f.submit %>
    </div>
<% end %>

当我提交不带标题的表格时,没有任何反应。它不会创建配方,因此我知道验证器正在工作,但没有出现错误。

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:2)

无论配方是否已创建,您都将用户重定向到new操作。重定向之后,将执行new操作,并且@recipe = Recipe.new@recipe设置为新对象,该对象不包含用户之前尝试创建的有关配方的任何信息(也不存在验证错误)。您应该做的是在create动作中呈现新动作,而不是重定向。这样的事情可能会有所帮助:

def create
  @recipe = Recipe.new(recipe_params)
  if @recipe.save
    redirect_to @recipe
  else
    render :new
  end
end

(我假设您已在控制器中执行了显示操作,并成功创建后将用户重定向到了显示操作。如果这不是正确的行为,只需将redirect_to @recipe更改为所需的内容即可)

答案 1 :(得分:1)

P。 Boro知道了,但我认为他们知道了if和else的错误方法,我的控制器现在看起来像这样并且可以正常工作!

def create
  @recipe = Recipe.new(recipe_params)
  if @recipe.save
    redirect_to @recipe
  else
    render :new
  end
end

谢谢

答案 2 :(得分:0)

很高兴得知您已找到解决方案。

但是您是Ruby和Rails的新手,所以我想建议您,首先通过scaffold生成器,以便您了解MVC的基本概念以及CRUD操作在Rails中如何工作?

使用脚手架生成代码后,请对其进行深入探索。