【问题标题】:'Errors' Partial works for 'New' user but not 'Edit' user“错误”部分适用于“新”用户,但不适用于“编辑”用户
【发布时间】:2018-05-31 06:10:32
【问题描述】:

我正在学习 Ruby on Rails 和 100% 的编码新手。 目前,我收到这条消息:

提取的源代码(第 1 行附近):nil:NilClass 的未定义方法“错误”

<% if obj.errors.any? %>

我只在我的 edit.html.erb 中收到此消息:

<%= render 'shared/errors', obj: @user %>

<div class='row'>
    <div class='col-xs-12'>
        <%= form_for(@user, :html => {class: "form-horizontal", role: "form"}) do |f| %>
            <div class="form-group">
                <div class="control-label col-sm-2">
                    <%= f.label :username %>
                </div>
                <div class="col-sm-8">
                <%= f.text_field :username, class: "form-control", placeholder: "Enter Username", autofocus: true %>
                </div>
            </div>
            <div class="form-group">
                <div class="control-label col-sm-2">
                    <%= f.label :email %>
                </div>
                <div class="col-sm-8">
                    <%= f.email_field :email, class: "form-control", placeholder: "Enter Email"  %>
                </div>
            </div>
                  <div class="form-group">
                <div class="control-label col-sm-2">
                    <%= f.label :password %>
                </div>
                <div class="col-sm-8">
                    <%= f.password_field :password, class: "form-control", placeholder: "Enter Password"  %>
                </div>
            </div>
            <div class = "form-group">
                <div class = "col-sm-offset-2 col-sm-10">
                    <%= f.submit 'Sign Up', class: "btn btn-primary btn-md" %>
                </div>
            </div>
        <% end %>

        <div class = "col-xs-4 col-xs-offset-5">
            [ <%= link_to 'Back to Index', articles_path %> ]
        </div>
</div>
    </div>

我的 new.html.erb 具有完全相同的代码,但没有收到错误消息。这是用户控制器:

class UsersController < ApplicationController

   def new 
      @user = User.new 
   end

   def create
       @user = User.new(user_params)
       if @user.save
           flash[:success] = "Welcome to Alpha Blog #{@user.username}"
           redirect_to articles_path
       else
           render 'new'
        end

    def edit
            @user = User.find(params[:id])
        end

    def update

    end
   end


    private

    def user_params
       params.require(:user).permit(:username, :email, :password) 
    end
end

这是部分错误:

<% if obj.errors.any? %>
    <div class="row">
        <div class="col-xs-8 col-xs-offset-2">
            <div class ="panel panel-danger">
                <div class="panel-heading">
                    <h2 class ="panel-title">
                    <%= pluralize(obj.errors.count, "error") %>
                    prohibited this article from being saved:
                    </h2>
                    <div class ="panel-body">
                        <ul>
                             <% obj.errors.full_messages.each do |msg| %>
                                <li><%= msg %></li>
                             <% end %>
                        </ul>
                    </div>
                </div>
            </div>
        </div>
    </div>
<% end %>

我做错了什么?提前致谢!

【问题讨论】:

  • 想询问错误。应该有类似:“nil 类的未定义方法 ”。这是正确的吗?如果是,请提供此错误。
  • 想问一下这个错误是什么时候出现的。当您到达“users/new”或“users/create”处理验证错误之后?
  • 在问题中添加一些堆栈跟踪?
  • @AlexanderSysuiev 刚刚更新了帖子:nil:NilClass 的未定义方法“错误”
  • 好吧,我有两个假设: 1. @user 变量没有定义,所以它是 nil。该请求是从不同的控制器发送的,或者您未提供控制器的完整代码。要检查它,请在您的部分 @user 2 中替换 objobj 是某种关键字。要检查它,请将其替换为 error_model

标签: ruby-on-rails


【解决方案1】:

当有大量的宝石和助手为你做这件事时,不确定你为什么要为此做部分工作。

问题是,您忘记了localspartial,您可以在Rails guide 中看到。

<%= render partial: 'shared/errors', locals: {obj: @user} %>

我个人建议将obj 更改为object,在rails 中我们喜欢写出单词。

【讨论】:

  • 我正在学习教程。我尝试按照您的建议进行操作,但仍然收到相同的错误消息。
  • 根据 Rails 指南,不需要部分和本地人。它是“呈现默认情况”。我认为问题出在实例变量中。
  • @j_nguyen 为了调试,你把&lt;%= local_assigns %&gt;放在你的partial中并从中删除其他代码。
  • 指南中的@AlexanderSysuiev:还请注意,在传递附加选项(例如 :layout)时,需要明确指定 :partial。 当您刚开始使用 Rails 时,它会有所帮助多一点表现力,暂时避免走捷径。
【解决方案2】:

您的update 操作似乎是空的,我的意思是该操作没有任何有效代码,您可以添加一些有效代码进行更新,如下所示

def update
    @user = User.find(params[:id])
    respond_to do |format|
        if @user.update_attributes(user_params)
            flash[:success] = 'User was successfully updated.'
            format.html { redirect_to @user }
            format.xml  { head :ok }
        else
            format.html { render :action => "edit" }
            format.xml  { render :xml => @user.errors, :status => :unprocessable_entity }
        end
    end
end 

现在尝试使用不正确的数据检查验证。

【讨论】:

    【解决方案3】:

    原来我关闭了 Create Method 中的“if”块,但没有关闭 Create Method 本身。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-15
      • 2019-05-07
      • 1970-01-01
      • 2017-09-01
      • 2013-11-03
      • 2016-03-01
      • 1970-01-01
      相关资源
      最近更新 更多