【问题标题】:Design pattern for side bar with dynamic content in RailsRails 中动态内容侧边栏的设计模式
【发布时间】:2011-12-24 17:04:10
【问题描述】:

我想要一个右侧栏,其中包含每个页面的内容更改。 例如,当我在好友页面时,侧边栏应该显示新好友。 当我在“帐户”页面时,侧栏应显示“最近的活动”。

我应该怎样做才能尊重 Rails 设计模式?我听说过 Cells gem,但我不确定我是否使用它。

【问题讨论】:

    标签: ruby-on-rails design-patterns sidebar


    【解决方案1】:

    这是一种方法,在您的布局中添加一个命名的产量部分

    <div id="main-content">
        <%= yield %>
    </div>
    <div id="side-content">
        <%= yield(:side_bar) %>
    </div>
    

    然后在您的视图中使用 content_for 将内容放入命名的 yield

    # friends view ....
    <% content_for(:side_bar) do %>
        <%= render :partial => "shared/new_friends" %>
    <% end %>
    
    # account view ....
    <% content_for(:side_bar) do %>
        <%= render :partial => "shared/recent_activity" %>
    <% end %>    
    

    这要求您明确说明每个视图的侧栏中显示的内容, 也许让它动态地做会更好?可能取决于具体情况和您的喜好

    另见 - http://guides.rubyonrails.org/layouts_and_rendering.html#understanding-yield

    【讨论】:

      【解决方案2】:

      在我们的观点发生重大设计变化的时刻,我提出了这个问题。在考虑了侧边栏问题之后,我意识到没有最好的解决方案(一如既往)。每种情况都有更好的解决方案。

      我将在此处比较 3 个解决方案:

      1. 使用 content_for(:sidebar) 和 yield(:sidebar)
      2. 使用局部方法
      3. 使用细胞宝石

      1.使用content_for(:sidebar)yield(:sidebar)

      这适用于您访问的每个链接(每个控制器操作)呈现不同侧边栏的情况。在这种情况下,您访问的每个视图都将包含 content_for(:sidebar) 部分。

      如果您的侧边栏视图仅取决于会话中某些变量的状态,例如,不应为您访问的每个链接呈现侧边栏。 然后你应该使用像 turbolinks 这样好的缓存系统,以避免多次渲染相同的东西,或者使用像 Cells gem 这样的东西和 javascript 来只渲染主要部分布局。

      2。使用部分

      使用分部总是有助于消除重复。如果您的侧边栏非常简单并且针对每个控制器进行了更改,您可以将其渲染为部分。但是如果你在同一个控制器中渲染不同的部分,根据某种状态,这可能表明你的视图中有业务逻辑,应该避免这种情况。

      3.使用细胞宝石

      当您每次都必须从与视图其余部分不同的控制器渲染侧边栏时,这是非常好的设计模式。

      它需要很多业务逻辑,这确实是一个很好的做法。

      这里有一个调用 viewaction。在该视图中,有一个声明 render_cell(:sidebar, params)。该语句会做一些业务逻辑并渲染侧边栏的视图。 好像 第一个动作调用其他控制器动作来呈现视图的特定部分(称为单元格)

      如果您只对侧边栏进行更改,您可能需要创建其他简单的操作,以便 javascript 请求它。此操作将再次调用render_cell(:sidebar) 方法以响应视图。

      这是一种非常有趣的方法。


      其他想法:

      • 您的侧边栏只能使用相同的 javascript 呈现 行动。
      • 您的侧边栏可以由角度控制器呈现,并且 rails 会发送带有侧边栏对象的 json。 (查找“单页应用”)

      【讨论】:

        【解决方案3】:

        试试这样的

        <div class="sidebar">
            <% if current_page?(controller => "friends", :action => "show") %>
                <h4>New Friends</h4>
            <% elseif current_page?(controller => "accounts", :action => "show") %>
                <h4>Recent Activities</h4>
            <% end %>
        </div>
        

        如果上面的代码符合你想要做的事情(看起来这是你想要实现的),那么坚持下去,否则使用一些 gem 可能是有益的。还可以查看 helper 页面以了解如何使用 current_page?方法。希望对你有帮助

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-11-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-07-08
          • 1970-01-01
          • 2014-09-07
          相关资源
          最近更新 更多