1

我有一个控制器,它有两个动作:“show”、“show_modify”。它们有非常相似但略有不同的视图,即 show_modify 有不同的div类,有额外的链接/按钮等等。

从我所看到的情况来看,有几种方法可以在 Rails 中解决这个问题:

  1. 为两者制作一个模板,然后在里面添加条件:

    <% if param[:action]=="show_modify"> <% ... %> <% end %>
    

    然而有很多不同,这看起来很丑陋和重复,这也是某种违反政教分离的行为(我不是 MVC 专家......)

  2. 部分方式:为每个显示不同的元素创建两个部分,每个操作一个。视图看起来像这样:

    # show_modify
    render :partial '_general_stuff'
    render :partial => '_blabla_show_modify'
    
    # show  
    render :partial => '_general_stuff'  
    render :partial => '_blabla_show'  `  
    

    然而这会违反 DRY,因为有重叠的元素。我可以继续制作更多的子部分,但基本上都是海龟——如果你不想重复自己,最终你必须去 if/else。

  3. 与当地人的部分:

    if show  
         render :partial = '_blabla', :locals => {:bckgrnd => 'blue', :button => 'yes' ....}
    

    但这是另一个很多-o-ifs 解决方案....

还有更好的选择吗?content_for也许?我有点像 Rails 菜鸟+,所以我可能完全错过了一些东西....

4

4 回答 4

0

根据您的描述,这两个视图似乎不太相似,在整个完整视图中都有各种例外。因此,您的许多 if 语句或部分不起作用的问题。

是否不可能以更好地匹配的方式重构您的视图?例如,保持 div 类名相同并根据您的视图切换 CSS。然后使用部分视图方法可能会更好。特别是如果您还将链接(提交按钮?)移到此局部视图之外并将其放入 show_modify 视图中。

于 2010-01-12T13:13:58.647 回答
0

如果差异很小,您可以使用您的第一个想法,但我宁愿做一些帮手:

def show_modify?
  param[:action] == "show_modify"
end

然后在视图中:

<% if show_modify? %>
  some html
<% end %>
...
<%= link_to "something", some_path if show_modify? %>

等等。

如果是 div 类,我会使用辅助方法来生成类名:

def set_class
  return "first_class" if show_modify?
  "second_class"
end
于 2010-01-12T13:15:35.577 回答
0

尝试将对象扩展为视图模型。这在 ASP.NET MVC 中很常见,当您想用与业务域无关的东西来扩展域对象时。

class User < ActiveRecord::Base
  # id, integer
  # first_name, string
  # last_name, string
  # only put the business-y stuff here. validations, etc.
end

class ShowUserViewModel < User
  def background_color
    "#0000ff"
  end

  def template
    "show"
  end
end

class EditUserViewModel < User

  def background_color
    "#00ff00"
  end

  def template
    "show_modify"
  end
end

从您的控制器中,根据所采取的操作,返回适当的对象。视图模型仍然是“用户”,但它们补充了视图所需的更多信息。这真的可以让很多iffor结构保持在视野之外。

于 2010-01-12T13:16:54.730 回答
0

我也有类似的情况。我正在考虑把我的观点分成两个完全不同的观点。如果这两个视图随着年龄的增长而变得越来越不同是有意义的,这可能是最好的选择,因为这两个新视图将完全解耦。如果您希望视图的大部分在showand之间保持不变show_modify,那么这种方法可能不太有用......

于 2013-06-13T17:47:56.973 回答