Проверка ноль в поле зрения в Ruby on Rails

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

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

Вещь состоит в том, хотя у меня обычно по различным причинам есть подобный ноль или недопустимые регистрации значения или моя модель или код контроллера. Я не назвал бы это дублированием кода в самом строгом смысле, но это просто не кажется очень 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 %>

Действительно ли это - хорошая идея, или это просто глупо?

13
задан alex.zherdev 1 May 2010 в 07:37
поделиться

5 ответов

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

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

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

7
ответ дан 2 December 2019 в 00:03
поделиться

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

<% 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
6
ответ дан 2 December 2019 в 00:03
поделиться

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

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

0
ответ дан 2 December 2019 в 00:03
поделиться

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

@object.try(:name)

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

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

2
ответ дан 2 December 2019 в 00:03
поделиться

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

Я бы рекомендовал вам создать метод для проверки nil (чтобы сделать его немного DRY) и передать ваш объект и проверить, является ли он nil или нет

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

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

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

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

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

cheers,

sameera

1
ответ дан 2 December 2019 в 00:03
поделиться
Другие вопросы по тегам:

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