NoMethod错误未定义方法`first_name'为零:NilClass

时间:2015-05-13 22:51:02

标签: ruby-on-rails ruby ruby-on-rails-4

运行 Rails 4.1.8 | Ruby 2.1.5p273

我尝试使用以下内容显示当前用户创建的备注的当前用户名:

show.html.erb中的

<%= "#{note.user.first_name.capitalize} #{note.user.last_name.capitalize[0]}" %>

<% @notes.each do |note| %>
        <tr>
          <td>
            <h4>
             <%= "#{note.user.first_name.capitalize} #{note.user.last_name.capitalize[0]}" %>
            </h4>
            <p><%= note.created_at.strftime("%-m/%-d/%y") %></p>
          </td>

          <td>
            <p><%= h(note.comment).gsub(/\n/, '<br/>').html_safe %></p>

如果我使用<%= "#{note.user.first_name.capitalize} #{note.user.last_name.capitalize[0]}" %>该应用就可以了。

我也检查了NotesController的注释,但我似乎无法找到问题。

class NotesController < ApplicationController
  before_action :set_note, only: [:edit, :update, :destroy]
  before_action :set_account
  before_action :authenticate_user!
  before_action :check_user, only: [:edit, :update, :destroy]

  # GET /notes/new
  def new
    @note = Note.new
  end

  # GET /notes/1/edit
  def edit
  end

  # POST /notes
  # POST /notes.json
  def create
    @note = Note.new(note_params)
    @note.user_id = current_user.id
    @note.account_id = @account.id

    respond_to do |format|
      if @note.save
        format.html { redirect_to @account, notice: 'note was successfully created.' }
        format.json { render :show, status: :created, location: @note }
      else
        format.html { render :new }
        format.json { render json: @note.errors, status: :unprocessable_entity }
      end
    end
  end

  # PATCH/PUT /notes/1
  # PATCH/PUT /notes/1.json
  def update
    respond_to do |format|
      if @note.update(note_params)
        format.html { redirect_to account_path(@account), notice: 'note was successfully updated.' }
        format.json { render :show, status: :ok, location: @note }
      else
        format.html { render :edit }
        format.json { render json: @note.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /notes/1
  # DELETE /notes/1.json
  def destroy
    @note.destroy
    respond_to do |format|
      format.html { redirect_to account_path(@account), notice: 'note was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_note
      @note = note.find(params[:id])
    end

    def set_account
      @account = Account.find(params[:account_id])
    end

     def check_user
      unless (@note.user == current_user) || (current_user.admin?)
        redirect_to root_url, alert: "Sorry, this note belongs to someone else"
      end
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def note_params
      params.require(:note).permit(:comment)
    end
end

我确定我失踪的东西很少,我只是看不到它。

3 个答案:

答案 0 :(得分:1)

您有一个没有与之关联的用户的注释,或者其中一个注释用户没有first_name或last_name(如果您发布了错误消息,我们就知道了)。如果你想防止这种情况,你必须确保用户,first_name和last_name在调用方法之前不是nil:

在模型中:

def display_user_name
  if user.nil?
    "No user"
  else
    "#{user.first_name.present? ? user.first_name : '<missing>'} "\
    "#{user.last_name.present? ? user.last_name.capitalize[0] : '<missing>'}"
  end
end

在模板中:

<%= note.display_user_name %>

或者,你可以使用伟大的andand宝石,然后在你的模板中你将拥有:

"#{note.user.andand.first_name.andand.capitalize} #{note.user.andand.last_name.andand.capitalize[0]}"

请注意它会返回&#34; &#34; (如果注释没有用户或没有名字且没有姓氏,则为其中包含空格的字符串)。

答案 1 :(得分:0)

试试这个:

Note app / models / note.rb 中:

def user_name
  @user_name ||= user.present? ? "#{user.first_name.capitalize} #{user.last_name.capitalize[0]}" : "No user" # or Anonymous(whichever suites your requirement)
end

然后在你的show.html.erb:

<%= note.user_name %>

下面:

  1. 您可以在一个地方编辑,以便将来在您的应用程序中引用用户名。
  2. 当您需要显示记事的用户名时,不要重复自己(DRY)。
  3. 易于测试。

答案 2 :(得分:0)

我想出了这个问题。我有几个&#34;笔记&#34;有一些&#34; null&#34;数据库中的值,这就是它无法与current_user关联的原因。

enter image description here

删除具有空值的说明后,问题已得到纠正。