【问题标题】:Belongs To User association属于用户关联
【发布时间】:2016-03-29 09:19:49
【问题描述】:

我只想显示创建事件的用户名。但是当我尝试时它说

undefined method `user_name' for nil:NilClass

这是我的活动.rb

class Event < ActiveRecord::Base
  belongs_to :user
  validates :name, presence: true
  validates :description, presence: true, length: {minimum: 5}
end

这是我的 user.rb

class User < ActiveRecord::Base
  has_secure_password
  has_many :events
end

我正在尝试在html.erb 文件中显示用户名,如下所示。

<%= event.user.user_name %>

但是我收到了这个错误。

这是我在events_controller中的创建方法

def create

    @event = current_user.events.new(event_params)

    respond_to do |format|
      if @event.save
        format.html { redirect_to @event, notice: 'Event was successfully created.' }
      else
        format.html { render :new }
      end
    end
  end

那么我应该怎么做才能在该页面中显示用户名。

谢谢

【问题讨论】:

  • 如果您打算在创建后立即显示创建事件的用户名(假设您在用户表中有一个“用户名”列),请尝试在 show.html.erb 中使用&lt;%= @event.user.user_name %&gt;事件。
  • 现在它说 nil:NilClass 的未定义方法“用户”
  • 如果问题中包含除&lt;%= @event.user.user_name %&gt; 以外的任何内容,请发布您的整个 show.html.erb 文件。
  • 你在用设计吗?
  • 我可以看到您没有该模型的 user_name 字段。我相信你想拥有那个领域,但你忘了创造一个。您可以添加和迁移数据库。您究竟想在什么视图中显示它?

标签: ruby-on-rails ruby activerecord associations


【解决方案1】:

好的,问题来了:

您想在索引页中显示活动的用户名,但您不能确定所有活动都有一个与之关联的用户。为了避免它,你可以使用。

<%= event.user.try(:user_name) || 'No user associated' %>

祝你好运!

【讨论】:

    【解决方案2】:

    虽然答案会让您的应用正常工作,但它不会解决您的问题。

    核心问题是您的Event 没有关联的User 对象。这不是问题,除非您的代码要求 Event 具有关联的Usercurrent_user.events.new 等)...

    您需要以下内容:

    #app/models/event.rb
    class Event < ActiveRecord::Base
       belongs_to :user 
       validates :user, presence: true #-> always makes sure user exists
       delegate :user_name, to: :user #-> event.user_name
    end
    

    --

    如果你使用上面的代码,你就可以调用@event.user_name(用delegate解决law of demeter)。您还将受益于使用 validates presence 以确保在创建和更新时存在 :user 关联。

    这将允许您依赖 @event.user 对象,对我来说,这比在您的应用中说“没有用户关联”要好得多:

    #view
    <%= @event.user_name if @event.user %>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-17
      • 2010-11-20
      • 2019-01-17
      • 2021-08-27
      • 1970-01-01
      • 1970-01-01
      • 2014-10-11
      • 1970-01-01
      相关资源
      最近更新 更多