2014-08-30 26 views
0

所以我的問題是以一種更好更簡單的方式展示模型。在Rails 4中顯示相應text_field_tag值的優雅方式

那麼目前的工作?

在我的瀏覽器能正常工作:

<%= text_field_tag(:first_name, (current_user.present? ? current_user : '').first_name.present? ? current_user.first_name : '') %> 

然而,這是太長,真的很難維持,尤其是當我有幾個領域。

因此,爲了避免我在我的控制器

def user_vals(value) 
    if(current_user.present?) 
     current_user.value.present? ? current_user.value : '' 
    end 
    return '' 
    end 

使這個在這個控制器我可以叫user_vals(:first_name),但得到undefined method value'`錯誤。此外,我不能只打電話

<%= text_field_tag(:first_name, @user_vals(:first_name)) %> 

由於我收到一些括號的語法錯誤,但這不是真正的問題。

所以我的最終目標是有這樣的事情:

<%= text_field_tag(:first_name, @user_vals(:first_name)) %> 

而不是第一個代碼,我上面給出。我怎樣才能做到這一點?

+0

''''profile_vals'''的意圖是什麼? – Carl 2014-08-30 13:36:40

+0

我的壞我的意思是用戶 – 2014-08-30 13:44:08

回答

1

在這種情況下,您可以使用try。只要寫:

<%= text_field_tag(:first_name, current_user.try(:first_name)) %> 

參見:http://apidock.com/rails/Object/try

+0

正如預期的那樣工作。你知道我是否可以從另一種方法做同樣的事情(即仍然使用'user_vals'方法並傳遞':first_name'參數)?如果可以,請舉個例子嗎? – 2014-08-30 13:57:00

+0

@SarpKaya:當你想調用一個可能爲'nil'的實例的方法時,可以使用'try'。請參閱我答案中的文檔鏈接。 – spickermann 2014-08-30 14:01:38

0

我會建議退後一步,並嘗試使用鴨打字來解決這個...

你現在所擁有的是什麼current_user方法。如果用戶沒有登錄,該方法可以返回任何想要的對象,並且該對象可以響應任何想要的內容。這裏有一個簡單的例子:

def current_user 
    @user || OpenStruct.new(first_name: "") 
end 

注:我假設@user持有用戶當前簽約......但這可能是一個電話super代替,或任何其他根據您的實現。

所以現在,而不是分支基於什麼類型的對象大家從current_user方法回來,你現在可以只使用返回的對象,不考慮。

current_user.first_name # => Either the User object's first name or `""` 

您可以通過創建例如, GuestUser類並返回GuestUser.new而不是上面的OpenStruct。 Guestuser將是一個不是數據庫支持的模型,可以根據需要響應任意數量的方法。

這個想法也被許多其他人所代表。並且使用一個類來防止基於nil的重複代碼切換實際上有一個名稱:特殊情況模式。作爲一個快速免費的例子,請參閱Guest User RailsCast。或者,如果您訂閱了Ruby Tapas,請務必查看插曲112: Special Case。 Avdi Grimm的優秀書籍Confident Ruby也深入討論了這個話題和其他許多問題,我強烈建議。