基于控制器名称 - RoR更改实例变量

时间:2014-07-12 04:16:37

标签: ruby-on-rails

我希望用以下部分做干事:

<div class="controls <%= 'hide' if @videos.total_pages == 1 and !administrator? %>">
  <% if administrator? %>
    <%= link_to "New #{controller_name.capitalize.singularize}", new_video_path, {:style => "margin-right: 10px;"} %>
  <% end %>
  <%= will_paginate @videos, :class => "pagination", :inner_window => 1 %>
</div>

你可以看到@videos出现两次。我可以仅根据控制器名称更改这些内容,类似于link_to?

2 个答案:

答案 0 :(得分:2)

我会建议不要进行这种重构。 DRY-ness和可读性之间存在一条界线。对于您和其他人来说,过多的抽象可能会使您的代码难以理解和调试。所以在我看来,在整个模板中重复一次实例变量名称并不是一件坏事,因为你可以一眼就看出代码应该做什么而不考虑它将运行的不同上下文。

同样,您的link_to名称有点聪明。我也会改为简单地说&#34; New Video&#34;。是的,你可能需要一些相同的部分(每个控制器一个),但它们的目的和执行方式将更加明确。

最后,根据用户是否是管理员,您似乎在视频控件上调用hide。这不是很好的设计,因为任何阅读页面源的人都可以通过更改可见性/显示值取消隐藏控件。我不知道你的代码的其余部分是做什么的,所以也许你可以用它。

答案 1 :(得分:0)

所以尽管最好不要对重构感到疯狂;如果需要这种技术,下面的代码将解决问题:

<% @group = instance_variable_get("@#{controller_name}") %>

<div class="controls <%= 'hide' if @group.total_pages == 1 and !administrator? %>">
  <% if administrator? %>
    <%= link_to "New #{controller_name.capitalize.singularize}", controller: "#{controller_name}", action: "new", :style => "margin-right: 10px;" %>
  <% end %>
  <%= will_paginate @group, :class => "pagination", :inner_window => 1 %>
</div>

现在,部分可用于具有类似功能的几个视图(即照片)