Подтвердить что ты не робот

Проверка нулевого значения в 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 %>

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

4b9b3361

Ответ 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