0

当用户访问 /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>。这似乎是我想做的一件简单的事情——我错过了什么?

4

3 回答 3

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 %>
于 2013-04-21T23:59:49.970 回答
0

where返回对象的集合,而不仅仅是单个对象。因此,根据返回的内容,您可能需要调用first以获取应该返回的单个实例,或者调用each以遍历想要的广告并将它们显示在您的页面上。

由于延迟加载结果的底层查询机制,您会看到ActiveRecord::Relationin的一个实例。更多细节可以在这里找到pry

于 2013-04-21T23:49:48.770 回答
0

假设你@wanted_ads的不是 nil 并且你想遍历所有想要的广告......

<% @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])
于 2013-04-21T23:54:13.127 回答