Я работал с направляющими некоторое время теперь и одной вещью, которую я делаю постоянно, проверяет, чтобы видеть, являются ли некоторый атрибут или объект нолем, по моему мнению, кодируют, прежде чем я отображу его. Я начинаю задаваться вопросом, является ли это всегда лучшей идеей.
Мое объяснение до сих пор было то, что начиная с моего приложения (приложений) полагаются на ввод данных пользователем могут произойти, неожиданные вещи. Если я узнал об одной вещи из программирования в целом, случается так, что пользователи, вводящие вещи, о которых не думал программист, являются одним из самых больших источников ошибок времени выполнения. Путем проверки на ноль оценивает, я надеюсь отступить, это и иметь мои представления корректно решает проблему.
Вещь состоит в том, хотя у меня обычно по различным причинам есть подобный ноль или недопустимые регистрации значения или моя модель или код контроллера. Я не назвал бы это дублированием кода в самом строгом смысле, но это просто не кажется очень DRY. Если я уже проверил на нулевые объекты в своем контроллере, это хорошо, если мое представление просто предполагает, что объект действительно не является нолем? Для атрибутов, которые могут быть нолем, которые отображены, имеет смысл мне проверять каждый раз, но для самих объектов я не уверен, какова лучшая практика.
Вот упрощенный, но типичный пример того, о чем я говорю:
код контроллера
def show
@item = Item.find_by_id(params[:id])
@folders = Folder.find(:all, :order => 'display_order')
if @item == nil or @item.folder == nil
redirect_to(root_url) and return
end
end
код представления
<% if @item != nil %>
display the item's attributes here
<% if @item.folder != nil %>
<%= link_to @item.folder.name, folder_path(@item.folder) %>
<% end %>
<% else %>
Oops! Looks like something went horribly wrong!
<% end %>
Действительно ли это - хорошая идея, или это просто глупо?
Ваш пример кода переделан:
код контроллера. (Я предполагаю, что это ItemsController)
def show
# This will fail with 404 if item is not found
# You can config rails to pretty much render anything on Error 404
@item = Item.find(params[:id])
# doesn't seem to be used in the view
# @folders = Folder.find(:all, :order => 'display_order')
# this is not needed anymore, or should be in the Error 404 handler
#if @item == nil or @item.folder == nil
# redirect_to(root_url) and return
#end
end
код просмотра, поскольку контроллер удостоверился, что у нас есть вспомогательный код @item
#display the item's attributes here
<%= item_folder_link(@item) %>
:
# display link if the item has a folder
def item_folder_link(item)
# I assume folder.name should be a non-blank string
# You should properly validate this in folder model
link_to( item.folder.name, folder_path(item.folder) ) if item.folder
end
В любом случае, я стараюсь сохранять представление очень простым. Обычно, если я вижу в представлениях циклы и условные выражения, я пытаюсь преобразовать их в помощников.
Нет, вы должны использовать
<% if @item.nil? %>
, например
@item1=nil
if @item1.nil? ### true
@item2 = ""
if @item2.nil? ### false
@item3 = []
if @item3.nil? ### false
@item4 = {}
if @item4.nil? ### false
, чтобы проверить, что объект пуст, если он ложный, пустой или пустая строка.
используйте
<% if @item.blank? %>
ref: - this
например
@item1=nil
if @item1.blank? #### true
@item2 = ""
if @item2.blank? #### true
@item3 = []
if @item3.blank? #### true
@item4 = {}
if @item4.blank? #### true
Ваш контроллер отвечает за принятие решения о том, какое представление будет отображаться. Если вы можете убедиться, что ваш контроллер никогда не отобразит это конкретное представление без item или item_folder, то вам не нужно проверять значения nil.
Под можете проверить я имею в виду, что у вас есть тесты/спецификации, которые проверяют, какое представление будет отображено для нулевых элементов и папок с элементами.
Не забудьте .try, который был добавлен в Rails 2.3. Это означает, что вы можете вызвать что-то вроде следующего:
@object.try(:name)
И если @object равен nil, ничего не будет возвращено. Возможно, это встроенное решение для идеи sameera207.
В идеале вы не должны отправлять в представление объекты nil, однако этого не всегда можно избежать.
Я лично думаю, что если вы проверяете nil
в ваших представлениях (и я думаю, что поскольку представление является конечным уровнем представления nil
должно проверяться на этом уровне), вы не хотите проверять это в контроллере. (но это не относится ко всем местам)
Я бы рекомендовал вам создать метод для проверки nil
(чтобы сделать его немного DRY) и передать ваш объект и проверить, является ли он nil или нет
что-то вроде:
def is_nil(object)
object.nil? ? '':object
end
и добавить его в контроллер приложения и сделать его хелпером (так что вы можете использовать его как в контроллерах, так и в представлениях)
(helper_method :is_nil
- добавьте эту строку в контроллер приложения)
и теперь вы можете передать объект, который вы хотите проверить, является ли он nil или нет.
cheers,
sameera