无法编辑项目 - <% if @user.errors.any? %>

Can't Edit Item - <% if @user.errors.any? %>

我正在使用简单表单 gem。

当我尝试使用无效数据更新项目以实例化时,遗漏了一些信息,例如价格。 Rails 假设重定向到编辑视图。正如您通过控制器看到的那样。

Blow 是 Items Controller 的更新方法

  def update
    @item = Item.find(params[:id])
    if @item.update(item_params)
       redirect_to @item
       flash[:success] = 'Item was successfully updated.'
    else
      flash[:danger] = "Item didn't update"
      render "edit"
    end
  end

然而事实并非如此。我刚收到这个错误。

正在显示

/Users/josep/Documents/Safsy/Website/Safsy/Safsy/app/views/shared/_error_messages.html.erb where line #1 raised:

undefined method `errors' for nil:NilClass

<% if @user.errors.any? %>
  <div id="error_explanation">
    <div class="alert alert-danger">
      The form contains <%= pluralize(@user.errors.count, "error") %>.
    </div>
    <ul>

下面是_error.messages.html.erb

<% if @user.errors.any? %>
  <div id="error_explanation">
    <div class="alert alert-danger">
      The form contains <%= pluralize(@user.errors.count, "error") %>.
    </div>
    <ul>
    <% @user.errors.full_messages.each do |msg| %>
      <li><%= msg %></li>
    <% end %>
    </ul>
  </div>
<% end %>

部分在我的 applications.html.erb

中呈现
<!DOCTYPE html>
<html>
  <head>
    <%= stylesheet_link_tag 'application', media: 'all',
                                           'data-turbolinks-track' => true %>
    <%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
    <%= csrf_meta_tags %>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href='https://fonts.googleapis.com/css?family=Raleway:500,900,200' rel='stylesheet' type='text/css'>

    <!--[if lt IE 9]>
      <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/r29/html5.min.js">
      </script>
    <![endif]-->
  <title>Safsy - The Safest Way To Shop</title>
  </head>
  <body>
    <%= render 'layouts/header' %>
    <%= yield :sliderhome %>
    <div class="container">
      <% flash.each do |message_type, message| %>
        <div class="alert alert-<%= message_type %>"><%= message %></div>
      <% end %>
      <%= yield %>
    </div>
    <%= render 'layouts/footer' %>
  </body>
</html>

Views/Items/edit.html.erb

<div class="page-header">
  <h1><%=@item.title  %> <small> Edit</small></h1>
</div>

<div class="container">
  <div class=“row”>
    <div class="col-md-6 col-md-offset-3">
      <div class="panel panel-primary">
        <div class="panel-body">
          <%= render 'shared/error_messages' %>
          <%= simple_form_for @item do |f| %>
            <%= f.input :image%>
            <%= f.input :title%>
            <%= f.input :price %>
            <%= f.input :description %>
            <%= f.button :submit, "Save changes", class: "btn btn-primary" %>
          <% end %>
        </div>
      </div>    
    </div>
  </div>
</div>

提前感谢您的帮助

错误是因为你的 error 部分有 @user 对象,但你的表单有 @item 对象,下面是解决方案

为每个对象制作 error 部分工作,在您的项目表单中将 render 'shared/error_messages' 行更改为此

<%= render 'shared/error_messages', form_object: @item %>

并将您的 _error_messages.html.erb 更改为

<% if form_object.errors.any? %>
  <div id="error_explanation">
    <div class="alert alert-danger">
      The form contains <%= pluralize(form_object.errors.count, "error") %>.
    </div>
    <ul>
    <% form_object.errors.full_messages.each do |msg| %>
      <li><%= msg %></li>
    <% end %>
    </ul>
  </div>
<% end %>

因此,当您在 application 布局中使用此部分时,请像我上面所做的那样在部分中传递表单对象!它会解决您的问题!

这样,你的错误就会被修复,你的代码也会干涸。希望对您有所帮助!