如何在rails中渲染这个部分

Posted

技术标签:

【中文标题】如何在rails中渲染这个部分【英文标题】:how to render this partial in rails 【发布时间】:2013-12-18 20:05:56 【问题描述】:

我正在尝试呈现关联的这一部分belongs_to 和has_many,即

我的模型就是这样

活动模型

class Activity < ActiveRecord::Base
    has_many :talks
end

谈话模型

class Talk < ActiveRecord::Base
    belongs :activity
end

在我的谈话控制器中我有

@activities = Activity.where(user_id: [current_user.friend_ids, current_user])
@talks = Talk.find(:all, :order => "created_at DESC")

我认为我有

<% activity.talks.each do |c| %>

        <div class="media">
          <a class="pull-left" href="#">
            <%=  image_tag(c.user.image.url(:tiny),:style=> "width: 100%;")%>
          </a>
          <div class="media-body">
            <strong><%= c.user.username %></strong> <%= c.details %><br>
            <small><span class="muted"><%="#time_ago_in_words(c.created_at) ago "%></span></small>
          </div>
        </div>


       <% end %>

这将显示每个活动的所有谈话

我如何创建&lt;% activity.talks.each do |c| %&gt;的一部分

【问题讨论】:

【参考方案1】:

创建一个局部

app/views/talks/_talk.html.erb

然后打电话

<%= render activity.talks %>

这将为activity.talks 集合中的每个谈话呈现一个_talk.html.erb 部分,它可以访问talk 变量。

此外,您可以通过阻止N + 1 queries 来优化代码。在您的控制器中,

@activities = Activity.includes(:talks).where(user_id: [current_user.friend_ids, current_user])

注意includes(:talks)。在上面链接的文档中阅读有关预加载的更多信息。

【讨论】:

非常感谢你拯救了我的一天,包括你额外的 include(:talks) 提示还有一件事是如果我在我的 _create.js.erb 中这样做,$("#chat").append (""); $("#new_talk")[0].reset();我将如何呈现您为我提供的部分...谢谢 如果您在create 操作(即@talks = Talk.find(...))中获取谈话内容,那么您可以执行$(&lt;selector&gt;).append("&lt;%= j render(@talks) %&gt;"); 之类的操作

以上是关于如何在rails中渲染这个部分的主要内容,如果未能解决你的问题,请参考以下文章

Ruby On Rails 部分渲染

Rails 4 使用 ajax、jquery、:remote => true 和 respond_to 渲染部分

Rails Ajax - 渲染不同的部分

在rails上渲染视图后如何获取html代码

内联 Javascript 在 Rails 3.1 上重新渲染部分 ruby​​ 时无法正常工作

rails 部分模板中的可选局部变量:我如何摆脱(定义的?foo)混乱?