Проверка нулевого значения в Ruby on Rails
Я работаю с Rails некоторое время, и одна вещь, которую я постоянно делаю, - это проверить, нет ли какого-либо атрибута или объекта в моем коде представления, прежде чем я его покажу. Я начинаю задаваться вопросом, всегда ли это лучшая идея.
Мое обоснование до сих пор заключалось в том, что, поскольку мое приложение полагаются на ввод пользователя, могут возникнуть непредвиденные ситуации. Если я вообще научился программировать, что пользователи, вводящие вещи, о которых программист не думал, являются одним из самых больших источников ошибок во время выполнения. Проверяя значения nil, я надеялся обойти это, и мои взгляды изящно справляются с этой проблемой.
Дело в том, что, как правило, по разным причинам у меня есть аналогичные нулевые или недопустимые значения в моей модели или коде контроллера. Я бы не назвал это дублированием кода в строгом смысле слова, но он просто не кажется очень сухим. Если я уже проверил для nil объектов в моем контроллере, это нормально, если мой взгляд предполагает, что объект действительно не нуль? Для атрибутов, которые могут быть ноль, которые отображаются, имеет смысл проверять каждый раз, но для самих объектов я не уверен, что является лучшей практикой.
Вот упрощенный, но типичный пример того, о чем я говорю:
код контроллера
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 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 %>
Это хорошая идея или это просто глупо?
Ответы
Ответ 1
Повторите следующий пример кода:
код контроллера. (Я предполагаю, что это 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 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
В любом случае, я стараюсь, чтобы все было очень просто. Обычно, если я вижу циклы и условные обозначения в представлениях, я пытаюсь реорганизовать их в помощники.
Ответ 2
Нет yuu следует использовать
<% 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
Ответ 3
Не забывайте .try, который был добавлен в Rails 2.3. Это означает, что вы можете вызвать что-то вроде следующего:
@object.try(:name)
И если @object равен нулю, ничего не будет возвращено. Возможно, это встроенное решение для идеи sameera207.
В идеале вы не должны отправлять нильские объекты в представление - однако этого не всегда можно избежать.
Ответ 4
Контроллер отвечает за решение о том, какой вид будет отображаться. Если вы можете проверить, что ваш контроллер никогда не будет отображать этот конкретный вид без элемента или item_folder, вам не нужно проверять значения nil.
Можно проверить, что у вас есть тесты/спецификации, которые проверяют, какое представление отображается для элементов nil и item_folders.
Ответ 5
Я лично считаю, что если вы проверяете нуль в своих представлениях (и я думаю, так как представление - это нечетный уровень представления, то nil должен быть проверен на этом уровне), вы не хотите проверять его в контроллере. (но это не распространяется на все места)
Я бы рекомендовал вам создать метод проверки nil (чтобы сделать его немного сухим) и передать ваш объект и проверить, нет ли он или нет
что-то вроде
def is_nil (объект)
object.nil?? "": Объект
end
и добавьте его в контроллер приложения и сделайте его помощником (чтобы вы могли использовать его как в контроллерах, так и в представлениях)
(helper_method: is_nil - добавьте эту строку в свой прикладной контроллер)
и теперь вы можете передать объект, который хотите проверить, является ли он ником или нет.
веселит,
sameera