在其显示页面上调用用户对象的特定实例

时间:2013-04-21 23:44:12

标签: ruby-on-rails activerecord

我在访问/ users /:id时尝试在其展示页面中列出用户所需的广告。

在我的控制器中我有:

 def show
    @user = User.find(params[:id])
    @wanted_ads = WantedAd.where(:user_id => params[:id])

在我的show.html.erb中,我有:

<%= @wanted_ads %>  

Binding.pry说@wanted_ads是零。在实际页面上,我得到#<ActiveRecord::Relation:0x007fa3b5a93408>。这似乎是我想做的一件简单事 - 我错过了什么?

3 个答案:

答案 0 :(得分:2)

where函数返回ActiveRecord::Relation。 因此,您可以调用first来获取第一个元素,last来获取最后一个元素,或all来获取存储在名为@wanted_ads的数组中的所有元素。

@wanted_ads = WantedAd.where(:user_id => params[:id]).all

然后,您可以浏览此数组并选择要传递给每个元素视图的属性。

只是提示:

您的用户模型中应该有ActiveRecord关系,如下所示:

has_many :wanted_ads

在你的WantedAd模型中,像这样:

belongs_to :user

有了这个,你就有了一对一的关系。

然后,你可以这样做:

def show
    @user = User.includes(:wanted_ads).find(params[:id])
end

然后,在你看来:

<% @user.wanted_ads.each do |wanted_ad| %>
    <%# do something %>
<% end %>

答案 1 :(得分:0)

where返回一个对象集合,而不仅仅是一个对象。因此,根据返回的内容,您需要致电first以获取应该返回的单个实例,或致电each来迭代所需广告并将其显示在您的网页上。

您在ActiveRecord::Relation中看到pry的实例,因为延迟加载结果的基础查询机制。 More details can be found here

答案 2 :(得分:0)

假设您的@wanted_ads不是零,并且您希望遍历所有想要的广告......

<% @wanted_ads.each do |wanted_ad| %>

<%= wanted_ad.some_attribute_of_wanted_ad %>

<% end %>  

我还建议您在控制器中使用以下代码了解SQL注入。

@wanted_ads = WantedAd.where(:user_id => params[:id])

应该是

@wanted_ads = WantedAd.where(":user_id => ?", params[:id])