Rails способ проверить существование объекта перед отображением - PullRequest
3 голосов
/ 25 сентября 2010

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

Это мой контроллер

 @user = User.find_by_username(params[:username])
 @profile = @user.profile 
 @questions = @user.questions

, и это мойview

 <% unless @profile.blank? %><%= link_to 'Edit Profile', :controller => 'profiles', :action => 'edit' %><% end %>


     <% unless @user.blank? %>
        Username:<%= @user.username %><br />
    Member Since:<%= @user.created_at.strftime("%d %B %Y")  %><br />
    <% end %>

  <% unless @profile.blank? %>
    First Name: <%= @profile.first_name %><br />
    Last Name: <%= @profile.last_name %><br /><br />
    About: <%= @profile.body %><br /><br />
    Location: <%= @profile.location %><br />
    Birthday: <%= @profile.birthday.strftime("%d %B %Y") %><br />
    <% end %>

Как вы можете видеть, я использую более одной проверки каждого вида (check, если @ profile.blank?), и я думаю, что будет лучший способ сделать это.

Есть ли в Rails способ сделать что-то умнее, чем тот, который я придумал?

Ответы [ 5 ]

9 голосов
/ 27 мая 2012

Также

<%= if @object.present? %>

выглядит намного проще для меня, чем

<%= unless @object.blank? %>

особенно, когда у нас более одного условного утверждения (&& \ || \ and \ or).

api.rubyonrails.org

5 голосов
/ 26 сентября 2010

Как я вижу, вы не можете пропустить этот @ .blank? проверка, поскольку вы не хотите отображать записи, если они пусты, но у меня есть несколько предложений

1 - сделать следующие разделы частичными

<% unless @user.blank? %>
    Username:<%= @user.username %><br />
    Member Since:<%= @user.created_at.strftime("%d %B %Y")  %><br />
<% end %>

и

<% unless @profile.blank? %>
  First Name: <%= @profile.first_name %><br />
  Last Name: <%= @profile.last_name %><br /><br />
  About: <%= @profile.body %><br /><br />
  Location: <%= @profile.location %><br />
  Birthday: <%= @profile.birthday.strftime("%d %B %Y") %><br />
<% end %>

это сделает ваш взгляд чище и даст вам гибкость использования их в любом программном обеспечении вашего приложения

2 - взять следующую строку

<% unless @profile.blank? %><%= link_to 'Edit Profile', :controller => 'profiles', :action=> 'edit' %><% end %>

внутри дисплея профиля как более подходящее

ура

Самера

1 голос
/ 19 мая 2017

Согласно документации по rails, вы можете увидеть, существуют ли какие-либо связанные объекты, используя association.nil?метод:

if @book.author.nil?
  @msg = "No author found for this book"
end
0 голосов
/ 16 июля 2018

Вероятно, подход с использованием рельсов будет использовать Объект # присутствие

Вы всегда должны unless @object.blank?, как вы сделали.

0 голосов
/ 25 сентября 2010

Как насчет создания пустого профиля для пользователя перед его сохранением?Как насчет использования аналогии с восклицательным знаком, который увеличит ActiveRecord::RecordNotFound, что в свою очередь отобразит страницу 404.

PS Я бы также рекомендовал обрезать контроллер до одной переменной экземпляра.

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