Rails 4 - 如何从他们的id获取用户名

时间:2014-06-09 22:54:02

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

我有一个订单显示页面如下所示。我有这个工作,但自从我改变计算机在这个应用程序上工作,名称没有显示。

如果我将<%= @order.user.name %>更改为<%= @order.user.id %>,我会获得正确的ID。否则,我什么都没有显示应该发布id的名称的位置。

#视图/命令/ show.html.erb

<p>
  <strong>Code:</strong>
  <%= @order.code %>
</p>

<p>
  <strong>Client:</strong>
  <%= @order.client.name %>
</p>

<p>
  <strong>User:</strong>
  <%= @order.user.name %>
</p>

<p>
  <strong>Notes:</strong>
  <%= @order.memo %>
</p>

<p>
  <strong>Status:</strong>
  <%= @order.status ? "Confirmed" : "In Progress"  %>
</p>



<%= link_to 'Edit', edit_order_path(@order) %> |
<%= link_to 'Back', orders_path %>

#models / order.rb snippet

class Order < ActiveRecord::Base
    belongs_to :user
end

#模型/ user.rb

class User < ActiveRecord::Base
  has_many :orders, dependent: :destroy
  has_many :addresses, dependent: :destroy
  has_many :telephones, dependent: :destroy

  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

    enum role: [:user, :manager, :admin]
  after_initialize :set_default_role, :if => :new_record?

  def set_default_role
    self.role ||= :user
  end
end

#conversor / order_controller.rb snippet

  def create
    @order = Order.new(order_params)
    @order.user_id = current_user.id
    @order.status = TRUE

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

3 个答案:

答案 0 :(得分:3)

我想我刚回答了你的另一个问题,但我建议使用这样的.delegate方法:

#app/models/order.rb
Class Order < ActiveRecord::Base
   belongs_to :user
   delegate :name, to: :user, prefix: true #-> @order.user_name
end

如果需要,您可以委派多个变量。 这修复了Law of Dementer,如here

所述

答案 1 :(得分:2)

它完全独立于您使用的机器,因此您必须在代码中进行一些您不记得的更改。

检查从控制台调用此用户时返回的值。在终端中键入rails c,然后键入命令:

User.find(<<ID_OF_USER_WHOES_NAME_IS_NOT_DISPLAYED>>).name

如果其名称为空,则可能是创建用户或其他内容的问题。

在检查时进行更新。

答案 2 :(得分:2)

如评论中所述,用户名的值为空,这就是为什么在查找名称时显示空白的原因。

向user.name添加名称(字符串)将解决问题

使用其他数据库时,请务必使用数据更新数据库,最好使用最初测试过的数据。