2010-09-16 3 views
1

У меня есть следующий код. Я все еще новичок в Ruby on Rails. Как видите, я повторяюсь 4 раза.Что было бы лучшим способом закодировать это, если предложение else?

Я пытался что-то вроде этого:

if @property.nil? || @property.status_id == 144 || (@property.status_id <= 16 && current_user.nil?) || (@property.status_id <= 16 && current_user.id != @property.user_id) 

Но это дает мне много ошибок в случае @property равна нулю. Потому что тогда @ property.status_id не может быть вызван, поскольку @property равен нулю.

В любом случае, я думаю, что опытный Ruby on Rails coder получает эту идею.

def show 
    @property = Property.find(params[:id]) rescue nil 
    if @property.nil? 
     flash[:error]=t("The_property_was_not_found") 
     redirect_to root_path 
     return 
    end 
    if @property.status_id == 144 
     flash[:error]=t("The_property_was_not_found") 
     redirect_to root_path 
     return 
    end 
    if @property.status_id <= 16 && current_user.nil? 
     flash[:error]=t("The_property_was_not_found") 
     redirect_to root_path 
     return 
    end 
    if @property.status_id <= 16 && current_user.id != @property.user_id 
     flash[:error]=t("The_property_was_not_found") 
     redirect_to root_path 
     return 
    end 
    @images = Image.find(:all, :conditions =>{:property_id => params[:id]}) 
    end 

корень

+0

Как правило, вам не нужно иметь значения дескриптора страницы представления. Как кто-то может попасть на страницу показа собственности, если она не существует в первую очередь? –

+0

Вы должны комбинировать свои тесты с '&&' и '||', вот для чего они предназначены. – meagar

+0

@beerlington это сайт для брокера недвижимости. Старые свойства удаляются из таблицы, заставляя посетителей со старыми ссылками получить сообщение об ошибке. У вас есть точка, возможно, они не должны удалять старые свойства. Во всяком случае, это гарантия. –

ответ

1

Это действительно точный код? || short-circuits и значение nil не должно быть проблемой.

@property=nil 
if @property.nil? || @property.status_id == 144 
    puts @property.class.to_s 
end 

Выходы NilClass

+0

Я просто попробовал ваше предложение, и действительно, кажется, что он действительно закорочен. Поэтому я добавил полную строку со всеми параметрами || и s, и она работает. Не знаю, почему вчера я получил ошибку. Возможно, это было до того, как я добавила спасательный нуль. –

+0

В любом случае, спасибо! –

2
def show 
    @property = Property.find(params[:id]) rescue nil 
    if @property.nil? || @property.status_id == 144 || (@property.status_id <= 16 && (current_user.nil? || current_user.id != @property.user_id)) 
     flash[:error]=t("The_property_was_not_found") 
     redirect_to root_path 
    else 
     @images = Image.find(:all, :conditions =>{:property_id => params[:id]}) 
    end 
    end 

Я не знаком с синтаксисом Ruby, так что это не может реально составить, но вы получите идею.

+0

Привет, Влад, я попробовал что-то похожее, думаю, вижу мою одну строку кода. Проблема в том, что @ property.status_id дает ошибку в случае, когда @property равен нулю. Затем я вызываю метод по значению nil. –

0

Вы можете попробовать это:

def show 
begin 
    @property = Property.find(params[:id]) 
    if [144,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0].include?(@property.status_id) 
    flash[:error]=t("The_property_was_not_found") 
    if current_user && (current_user.id != @property.user_id) 
     redirect_to myimmonatie_path 
    else 
     redirect_to root_path 
    end 
rescue 
    flash[:error]=t("The_property_was_not_found") 
    redirect_to root_path 
end 
@images = Image.find(:all, :conditions =>{:property_id => params[:id]}) 

конец

+0

О, общий, я знаю 'include?' Очень Ruby, но что не так с 'if @ property.status_id == 144 || @ property.status_id <= 16'? – meagar

+0

Я бы сказал, что в этих условиях нет ничего плохого. – tadman

+0

((0..16) .to_a << 144) .include? (@ Property.status_id) было бы немного более читаемым, возможно. Не уверен, что предпочтительнее комментарий скудного. – Shadwell

1

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

def can_show_property?(property) 
    return false unless (property) 

    return false if (property.status_id == 144 or property.status_id > 16) 

    return false unless (current_user && current_user.id == property.user_id) 

    true 
end 

def show 
    @property = Property.find(params[:id]) rescue nil 

    unless (can_show_property?(@property)) 
    flash[:error]=t("The_property_was_not_found") 
    redirect_to root_path 
    return 
    end 

    @images = Image.find(:all, :conditions =>{ :property_id => params[:id] }) 
end 

Наличие «волшебных» чисел в вашем коде, например, 144, приводит к тому, что они не задают константы. Как правило, гораздо легче понять, когда четко обозначен MyApp::PROPERTY_LOCKED.

+0

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

Смежные вопросы