【问题标题】:Displaying associated data in rails (user_id, email, etc)在 rails 中显示相关数据(user_id、email 等)
【发布时间】:2013-02-23 01:32:38
【问题描述】:

我已经找到了一些关于此的帖子,但到目前为止,我尝试使用的所有内容都没有为我完成。我对 Rails 还是很陌生——我对 HTML 和 CSS 基本很熟悉,但是我学习了 Skillshare Rails 课程,并且正在努力将它与 Railstutorial 书结合起来。所以请温柔一点。

我有一个基本应用程序,用户可以创建“项目”。我用脚手架架起“物品”。它们也可能是微博。但是对于脚手架创建的视图,我想显示用户的电子邮件地址而不是电子邮件地址。我将在模型、视图和控制器中进行哪些更改?这就是我所拥有的。

控制器:

def email
  @email = @item.user_id.email
end

查看:

<td><%= item.content %></td>
<td><%= @email %></td>
<td><%= link_to 'Show', item %></td>
<td><%= link_to 'Edit', edit_item_path(item) %></td>
<td><%= link_to 'Destroy', item, confirm: 'Are you sure?', method: :delete %></td>

商品型号:

class Item < ActiveRecord::Base
  attr_accessible :content, :user_id
  validates :content, :length => { :maximum => 140 }
  belongs_to :user
end

用户模型:

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :token_authenticatable, :confirmable,
  # :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable

  # Setup accessible (or protected) attributes for your model
  attr_accessible :email, :password, :password_confirmation, :remember_me
  has_many :items
end

【问题讨论】:

  • 我想你想要@email = @item.user.email,因为你收不到user_id的电子邮件

标签: ruby-on-rails ruby views models erb


【解决方案1】:

有三种方法。

首先, 我感觉最好的方式。根据您的要求是简单的委派。

class Item < ActiveRecord::Base
  attr_accessible :content, :user_id
  validates :content, :length => { :maximum => 140 }
  belongs_to :user

  delegate :email, to: :user
end

在视图中,

只需调用。

<td><%= item.email %></td>

就像@cluster所说的

你可以在控制器中使用

@email = @item.user.email

或者

将代码移至项目模型

class Item < ActiveRecord::Base
  attr_accessible :content, :user_id
  validates :content, :length => { :maximum => 140 }
  belongs_to :user

  def user_email
    user.email
  end
end

在视图中,

<td><%= item.user_email %></td>

【讨论】:

  • 这非常有帮助!非常感谢!
【解决方案2】:

在您的控制器中,您不想添加其他方法,因为这些方法是用户应该能够通过 URL 访问的“操作”。 (在某些情况下,例如在过滤器之前,您会这样做,但这超出了这里的范围)。

您可以在控制器操作中执行此操作

class ItemsController
  def show
    @item = Item.find params[:id]
    @email = @item.user.email
  end
end

或者您可以简单地在视图本身中调用@item.user.email

【讨论】:

    猜你喜欢
    • 2014-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    • 2020-06-17
    • 2018-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多