2012-01-11 69 views
11

我已經看到了這個代碼在Rails教程中我做軌/紅寶石「並返回false」語法

def access_denied 
    redirect_to login_path, :notice => "Please log in to continue" and return false 
end 

學習軌道之前,我做了大量的紅寶石的研究和所有書籍的我讀過這裏「並返回false」的語法。我在rails語法中找不到任何提及,是否有人能夠提供一個鏈接或任何解釋來清除它?

我不明白在這裏需要「和」,因爲我認爲ruby總是會返回最後一次評估的表達式。

+0

哦,我以爲你在問*爲什麼會被使用。無論如何,如果我的答案中所述的過濾器正在使用它,請非常謹慎。 – 2012-01-11 19:47:55

回答

21

在那裏你能寫回報在同一行此前的說法錯誤的僅供。

這相當於這樣做的:

redirect_to login_path, :notice => "Please log in to continue" 
return false 

它不完全一樣的,因爲與「和」,它只會返回false如果redirect_to的方法返回的東西是不是,但因爲它幾乎總是返回一些不是也不然後語句的右側總是執行(和返回)。

和紅寶石只是一個別名& &,準確地行爲就像它只有一個區別,它具有比語句的所有其他部分較低的優先級,所以首先它的計算結果無論是在它的離開然後被應用。 Ruby還有,這與||相同。但在表達式中優先級較低。

+1

如果你想添加一個總是執行的返回值,但是你不能確信第一個表達式總是返回非錯誤的,你也可以使用分號而不是'和',就像這樣:'do_something論證,論證;返回false「 – 2014-02-23 03:23:56

2

這種類型的結構曾經與過濾器一起使用,當期望過濾返回值時。 false將暫停正常的請求處理。

所以,如果控制器是這樣的:

class FooController < ActionController::Base 
    before_filter :access_denied 
    # etc. 
end 

控制器的動作會跑的無;這種方法很可能設計堪稱過濾器,如:

def check_access 
    return access_denied unless current_user.has_access 
end 

這些天,過濾器的返回值被忽略。

它可以作爲一個常用的方法來停止處理動作並在重定向後返回,所以沒有其他的邏輯/渲染/等等。在控制器內運行。

3

redirect_to login_path, :notice => "Please log in to continue"是Ruby中的一個不返回false的正常表達式(或無,請參見source code),因此程序繼續執行(在AND之後檢查第二部分),並且可以執行return false。運營商

1

文檔:Under the "Defined?, And, Or, and Not" section

使用and是鏈接相關操作有用在一起,直到其中一人返回nilfalse。您可以像您在問題中顯示的那樣使用它,或者也可以使用它來短路代碼行。

# Short circuit example 
blog = Blog.find_by_id(id) and blog.publish! 

的博客只得到調用它.publish!如果find_by_id成功。

在您的例子:

def access_denied 
    redirect_to login_path, :notice => "Please log in to continue" and return false 
end 

他們只是用它來更緊湊在一行寫的代碼。

然而,它也是在那裏你可以根據條件語句呈現控制器操作有用的,你不想讓Rails的「多呈現」警告:

def show 
    if something 
    render :partial => 'some_partial' 
    end 

    render :partial => 'some_other_partial' 
end 

Rails會給出警告如果something返回true,因爲您有多個呈現語句在動作中被評估。但是,如果將其更改爲

if something 
    render :partial => 'some_partial' and return 
end 

它將允許您停止執行操作。