加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 如何在视图文件中管理if-then爆炸?

发布时间:2020-12-17 03:19:46 所属栏目:百科 来源:网络整理
导读:如果这不遵循良好的问题指导方针,我表示歉意,但我希望它在 How to Manage CSS Explosion课堂上表现良好并且收到同样有用的回复. 我熟悉一些基本的视图冗余缓解策略,如下所示: 在适当的地方使用帮助者 不要重复自己 使用部分和布局 如果我在上面的列表中遗漏
如果这不遵循良好的问题指导方针,我表示歉意,但我希望它在 How to Manage CSS Explosion课堂上表现良好并且收到同样有用的回复.

我熟悉一些基本的视图冗余缓解策略,如下所示:

>在适当的地方使用帮助者
>不要重复自己
>使用部分和布局

如果我在上面的列表中遗漏了一些重要的想法,请随意提出建议.

尽管如此,我仍然认为在我看来有几个维度/自由度,导致很多if-then语句或至少三元块.例如,在我正在搞乱的事情中,我正在为一个程序的标题栏工作,当三个“大”变量调用视图时:

>用户是否是管理员
>用户是否已登录
>正在查看的页面是属于用户还是其他人

它最终看起来像这个烂摊子:

<% content_for :subheader do %>
  <div class="row">
    <% if @user %>
      <% if @user == current_user %>
        <%= link_to 'My programs',user_programs_path(current_user),:class => 'active' %>
      <% else %>
        <%= link_to "#{@user.username}'s programs",user_programs_path(@user),:class => 'active' %>
      <% end %>
      <%= link_to 'Browse all programs',programs_path %>
    <% else %>
      <% if current_user %>
        <%= link_to 'My programs',user_programs_path(current_user) %>
      <% end %>
      <%= link_to 'Browse all programs',programs_path,:class => 'active' %>
    <% end %>
    <%= link_to 'New Program',new_program_path,:class => 'admin' if current_user.admin? %>
  </div>
  <% if @regions %>
    <div class="row second">
      <%= link_to 'Regional program search',request.fullpath,:class => 'active' %>
    </div>
  <% end %>
<% end %>

丑陋.可读且易于访问,但很难看.一些建议?

在经验和LESS之类的新技术之间,我已经非常擅长减少我的CSS文件,但我仍然遇到了MVC视图的爆炸问题.

解决方法

我会使用帮助器和模型定义来干掉你的代码:

class User
  def possesive
    self == current_user ? 'My' : "#{username}'s"
  end
end

module ...Helper
  def user_program_link user
    if user
      link_to "#{user.possesive} programs",user_programs_path(user),:class => 'active'
    elsif current_user
      link_to 'My programs',user_programs_path(current_user)
    end
  end
end

然后,您可以简化user_program_path调用的所有if语句:

<%= user_program_link @user %>

这会将您的查看代码减少到:

<% content_for :subheader do %>
  <div class="row">
    <%= user_program_link @user %>
    <% if @user %>
      <%= link_to 'Browse all programs',programs_path %>
    <% else %>
      <%= link_to 'Browse all programs',:class => 'active' %>
    </div>
  <% end %>
<% end %>

继续此过程以干掉其余代码.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读