Проверка на нулевое значение в Ruby on Rails - PullRequest
13 голосов
/ 01 мая 2010

Я уже некоторое время работаю с Rails, и одна вещь, которую я постоянно нахожу, это проверка на наличие в моем коде представления какого-либо атрибута или объекта, равного нулю, до его отображения. Я начинаю задумываться, всегда ли это лучшая идея.

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

Дело в том, что у меня, как правило, по разным причинам есть аналогичные проверки на nil или недопустимые значения либо в моей модели, либо в коде контроллера. Я бы не назвал это дублированием кода в самом строгом смысле этого слова, но, похоже, оно не очень СУХОЕ. Если я уже проверил наличие 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'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 %>

Это хорошая идея или просто глупо?

Ответы [ 5 ]

7 голосов
/ 01 мая 2010

Ваш пример кода переделан:

код контроллера. (Я предполагаю, что это 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

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

6 голосов
/ 01 мая 2010

Нет, вы должны использовать

<% 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: - это

например

@item1=nil
if @item1.blank? #### true
@item2 = ""
if @item2.blank? #### true
@item3 = []
if @item3.blank? #### true
@item4 = {}
if @item4.blank? #### true
2 голосов
/ 02 мая 2010

Не забудьте .try, который был добавлен в Rails 2.3. Это означает, что вы можете вызвать что-то вроде следующего:

@object.try(:name)

И если @object равен nil, ничего не будет возвращено. Возможно, это встроенное решение для идеи sameera207.

В идеале, вы не должны отправлять ноль объектов в представление - однако не всегда возможно избежать.

1 голос
/ 01 мая 2010

Лично я считаю, что если вы проверяете nil в своих представлениях (и я думаю, что поскольку представление является конечным уровнем представления, nil следует проверять на этом уровне), вы не хотите проверять его вконтроллер.(но это не относится ко всем местам)

Я бы порекомендовал вам создать метод для проверки nil (сделать его немного СУХИМ) и передать ваш объект и проверить, является ли он нулевым или нет

что-то вроде:

def is_nil(object)
 object.nil? ? '':object 
end 

и добавьте его в контроллер приложения и сделайте его вспомогательным (чтобы вы могли использовать его как в контроллерах, так и в представлениях)

(helper_method :is_nil - добавить эту строку в контроллер вашего приложения)

и теперь вы можете передать объект, который вы хотите проверить, если он равен нулю или нет.

ура,

sameera

0 голосов
/ 01 мая 2010

Ваш контроллер отвечает за решение, какое представление будет отображено. Если вы можете проверить , что ваш контроллер никогда не будет отображать этот конкретный вид без item или item_folder, вам не нужно проверять нулевые значения.

С помощью можно проверить Я имею в виду, что у вас есть тесты / спецификации, которые проверяют, какое представление отображается для нулевых элементов и папок элементов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...