Направляющие: Рефакторинг, представления, помощники: как все это сочетается?

Команда ls в сочетании с параметром -l (длинный список) возвращает атрибуты информации о файлах и каталогах. В частности, первый символ выхода ls -l обычно представляет собой d или - (тире). В случае d список, указанный в списке, является достоверным.

Следующая команда в одной строке сообщит вам, содержит ли данная переменная ISDIR путь к каталогу или нет:

[[ $(ls -ld "$ISDIR" | cut -c1) == 'd' ]] &&
    echo "YES, $ISDIR is a directory." || 
    echo "Sorry, $ISDIR is not a directory"

Практическое использование:

    [claudio@nowhere ~]$ ISDIR="$HOME/Music" 
    [claudio@nowhere ~]$ ls -ld "$ISDIR"
    drwxr-xr-x. 2 claudio claudio 4096 Aug 23 00:02 /home/claudio/Music
    [claudio@nowhere ~]$ [[ $(ls -ld "$ISDIR" | cut -c1) == 'd' ]] && 
        echo "YES, $ISDIR is a directory." ||
        echo "Sorry, $ISDIR is not a directory"
    YES, /home/claudio/Music is a directory.

    [claudio@nowhere ~]$ touch "empty file.txt"
    [claudio@nowhere ~]$ ISDIR="$HOME/empty file.txt" 
    [claudio@nowhere ~]$ [[ $(ls -ld "$ISDIR" | cut -c1) == 'd' ]] && 
        echo "YES, $ISDIR is a directory." || 
        echo "Sorry, $ISDIR is not a directoy"
    Sorry, /home/claudio/empty file.txt is not a directory
16
задан San Diago 3 February 2010 в 19:18
поделиться

2 ответа

Рефакторинг упрощает поддержку ваших представлений. Проблема заключается в том, чтобы выбрать, куда добавляется переработанный код.

Вы можете выбрать частичных и помощников . Там нет каменных правил, предписывающих, где и где их следует использовать. Существует пара рекомендаций, в которых говорится, что помощники не должны содержать HTML.

Обычно партиалы лучше подходят для рефакторинга разделов, которые больше HTML / ERB / ​​HAML, чем ruby. Помощники, с другой стороны, используются для фрагментов кода ruby ​​с минимальным HTML или для генерации простого HTML из параметров.

Однако я не согласен с мнением о том, что помощники вообще не должны содержать HTML. Немного в порядке, просто не переусердствуйте. То, как обрабатываются помощники, затрудняет их использование для создания больших объемов HTML. Вот почему предполагается, что ваши помощники содержат минимальное количество HTML. Если вы посмотрите на источник помощников, которые поставляются с рельсами, вы заметите, что большинство из них генерируют html. Те немногие, которые этого не делают, в основном используются для генерации параметров и оценки общих условий.

Например, любой из помощников формы или вариантов link_to соответствуют первой форме помощников. В то время как такие вещи, как url_for и logged_in? как это предусмотрено различными моделями аутентификации второго типа.

Это цепочка решений, которую я использую, чтобы определить, следует ли выделять код из представления в частичное или вспомогательное.

  1. Повторение или почти идентичные утверждения, создающие один неглубокий тег HTML? => Помощник.
  2. Общее выражение используется в качестве аргумента для другого помощника? => Помощник.
  3. Длинное выражение (более 4 терминов) используется в качестве аргумента для другого помощника? => Помощник.
  4. 4 или более строк ruby ​​(которые не оцениваются в HTML)? => Помощник.
  5. Практически все остальное => частичное.

Я собираюсь использовать код, который вы хотите реорганизовать в качестве примера:

Я бы реорганизовал вид в вопросе следующим образом:

app / helpers /beast_helper.rb:

def beast_action(beast)
  if beast.dead?
    link_to "bury", bury_beast_path(beast)
  else
    link_to "kill!", kill_beast_path(beast)
  end
end

app / views / beasts / _beast.html.erb:

<%= beast.body %>
<%= beast_action(beast) %>

app / views / beasts / index.html.erb:

<%= render :partial => "beast", :collection => @beasts %>

Это технически более сложно, потому что это 3 файла и всего 10 строк, а не 1 файл и 10 строк. Представления в настоящее время только 3 строки объединены в 2 файла. Конечный результат - ваш код намного более СУХОЙ. Позволяет вам повторно использовать части или все это в других контроллерах / действиях / представлениях с минимальной дополнительной сложностью.

Что касается идентификатора тега вашего тела. Вы действительно должны использовать content_for / yield. Для такого рода вещей.

app / views / layouts / application.html.erb

...
<body id="<%= yield(:body_id) %>">
...

app / views / beasts / index.html.erb

<% content_for :body_id, controller_action %>
...

Это позволит вам переопределить идентификатор тела в любом представлении, которое требует этого. Например:

app / views / users / preferences.html.erb

<% content_for :body_id, "my_preferences" %>
26
ответ дан 30 November 2019 в 16:58
поделиться

Самый простой способ справиться с этим - использовать метод live ():

<script type="text/javascript"> 
         $(document).ready(function() { 
             $("#button").live('click', function() { 
                 alert('button clicked'); 
             }); 
         });    
</script>  
-121--1557919-

Использование пользовательского атрибута url делает HTML недопустимым. Хотя это, возможно, не является огромной проблемой, приведенные примеры не доступны. Не для навигации с клавиатуры и не в случаях, когда JavaScript выключен (или заблокирован каким-либо другим сценарием). Даже Google не найдет страницу, расположенную по указанному URL-адресу, по крайней мере, не по этому маршруту.

Сделать это доступным довольно просто. Просто убедитесь, что внутри див есть обычная ссылка, указывающая на url. С помощью JavaScript/jQuery к div добавляется щелчок мыши, который перенаправляется в расположение, указанное атрибутом href ссылки. Теперь, когда JavaScript не работает, ссылка все равно делает, и она может даже поймать фокус при использовании клавиатуры для навигации (и вам не нужны пользовательские атрибуты, так что ваш HTML может быть действительным).


Я написал плагин jQuery некоторое время назад, который делает это. Он также добавляет classNames к div (или любому другому элементу, который нужно сделать кликабельным) и ссылке, чтобы можно было изменить их внешний вид с помощью CSS, когда div действительно кликнут. Он даже добавляет classNames, которые можно использовать для задания стилей наведения и фокусировки.

Все, что вам нужно сделать, это указать элементы, которые вы хотите сделать доступными для щелчка, и вызвать их метод clickable (): в вашем случае это будет $ ("div.clickable) .clickable ();

Для загрузки + документации см. страницу плагина: jQuery: clickable - jLix

-121--1356105-

Первым делом я бы сделал следующее:

#index.html.erb
<%= render @beasts %>

#_beast.html.erb
<%= beast.body %>
<%= link_to_next_beast_action(beast) %>    

#beast_helper.rb
def link_to_next_beast_action(beast)
  if beast.dead?
    link_to "bury", bury_beast_path( :id => beast.id ) 
  else
    link_to "kill!", kill_beast_path( :id => beast.id )
  end
end

То, что я сделал, отделяет визуализацию зверя от частичной, которая использует семантику сбора.

Затем я перевел логику для показа связей убийства/захоронения в помощника зверя. Таким образом, если вы решите добавить другое действие (например, "вернуть из мертвых"), вам придется только сменить помощника.

Помогает ли это?

8
ответ дан 30 November 2019 в 16:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: