Rails: Как лучше всего разделить два очень похожих взгляда? - PullRequest
1 голос
/ 12 января 2010

У меня есть контроллер, который выполняет два действия: «show», «show_modify». Они имеют очень похожие, но немного разные представления, т.е. show_modify имеет различные классы div, дополнительные ссылки / кнопки и т. Д.

Из того, что я видел, есть несколько способов достичь этого в рельсах:

  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'  `  
    

    Все же это нарушит СУХОЕ, потому что есть перекрывающиеся элементы. Я могу продолжать делать больше подчастей, но в основном это все черепахи вниз - в конце концов вам придется идти если / иначе, если вы не хотите повторяться.

  3. Частичные с местными жителями:

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

    но это еще одно решение лотов-о-если ....

Есть ли лучшие варианты? content_for может быть? Я вроде Rails noob +, так что, возможно, я что-то пропустил совсем ...

Ответы [ 4 ]

0 голосов
/ 13 июня 2013

Я в похожей ситуации. Я обдумываю свою точку зрения и разделяю ее на две совершенно разные точки зрения. Это, вероятно, лучший вариант, если имеет смысл, что эти два представления будут становиться все более разнородными по мере их старения, поскольку два новых представления будут полностью отделены. Если вы хотите, чтобы значительная часть представления оставалась неизменной между show и show_modify, этот подход, вероятно, менее полезен ...

0 голосов
/ 12 января 2010

Если различия очень малы, вы можете использовать свою первую идею, но я бы лучше сделал несколько помощников:

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
0 голосов
/ 12 января 2010

Попробуйте расширить объект как модель представления.Это действительно распространено в 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

От вашего контроллера, в зависимости от предпринятых действий, вернутьсоответствующий объект.Модели представления по-прежнему являются «пользователями», но они дополняются дополнительной информацией, необходимой для представления.Это действительно может держать множество структур if и for вне поля зрения.

0 голосов
/ 12 января 2010

Из вашего описания, два вида не кажутся очень похожими, по всему полному виду сделаны все виды исключений. Отсюда ваша проблема с множеством операторов if или partials, которые не работают.

Разве нельзя реорганизовать ваши взгляды таким образом, чтобы они лучше соответствовали? Например, сохраняйте имена классов div одинаковыми и переключайте CSS в зависимости от вашего представления. Тогда использование метода частичных представлений может работать намного лучше. Особенно, если вы также переместите ссылки (кнопка отправки?) За пределы этого частичного представления и поместите его в представление show_modify.

...