2017-04-24 58 views
-1

我在一段時間內沒有使用過Rails,並且我想清除一些內容。無法在Rails控制器中更改變量屬性

因此,@符號表示,特定的變量將在該控制器視圖內可訪問。正確?

含義,如果我有一個路線

get '/admin/user:id' to: 'admin#user'

這意味着,無論何時,我去的路線,它會去的路線'/admin/user:id',然後將所有@variables在訪問控制器。正確?

現在這是我的一個小問題,通常在JavaScript中是一個簡單的if-statement

例如,說我有一個User模型,我想顯示一個小Friend的名單與朋友.first_namelast_namefavourite_food。我可以簡單地做

admins_controller

def user 
    @user = user.find_by(:id => params[:id]) 
end 

然後在我的意見表明,該有類似

<h1><%= @user.name %>'s Friends List</h1> 
<table> 
    <tr><%= @user.user_friends.first.friend.first_name %></tr> 
    <tr><%= @user.user_friends.first.friend.last_name %></tr> 
    <tr><%= @user.user_friends.first.friend.favourite_food %></tr> 
</table> 

問題如果他們不」沒有朋友,我想把一切都設置爲「不適用」。這是我在我的控制器中進行的。

def user 
    @user = user.find_by(:id => params[:id]) 
    if @user.friends.nil? 
    @user.user_friends.first.friend.name = "N/A" 
    @user.user_friends.first.friend.name = "N/A" 
    @user.user_friends.first.friend.name = "N/A" 
    end 
end 

我想我可以創建另一個@variable但是,我假定這將是一個更好的辦法,因爲它不是好製造不必要的寬範圍的變量。

回答

0

我會直接把這個邏輯上來看,與三元運算符,就像這樣:

<table> 
    <tr><%= @user.user_friends.nil? ? "N/A" : @user.user_friends.first.friend.first_name %></tr> 
    <tr><%= @user.user_friends.nil? ? "N/A" : @user.user_friends.first.friend.last_name %></tr> 
    <tr><%= @user.user_friends.nil? ? "N/A" : @user.user_friends.first.friend.favourite_food %></tr> 
</table> 

,並保持你控制器苗條:

def user 
    @user = user.find(params[:id]) 
end 
+0

哦,是的,我忘了這一點。是的,我們現在的控制器大約有60行,但是它有很多數學和轉換秒數,日期等等。 – dsomel21

+0

如果你只是爲了顯示目的而轉換,你應該把這個邏輯放到你的視圖中(並且更好的是,視圖助手)。 – Gerry

+0

'user.find(params [:id])'就夠了 – Iceman

1

此邏輯屬於來看,這樣做

<% if @user.user_friends.any? %> 
    <tr><%= @user.user_friends.first.friend.first_name %></tr> 
    <tr><%= @user.user_friends.first.friend.last_name %></tr> 
    <tr><%= @user.user_friends.first.friend.favourite_food %></tr> 
<% else %> 
    <tr>N/A</tr> 
    <tr>N/A</tr> 
    <tr>N/A</tr> 
<% end %> 
1

就個人而言,我使用presenter模式像這樣的情況。所以,在你的控制,你會做這樣的事情:

def user 
    @user = user.find_by(:id => params[:id]) 
    @user_presenter = UserPresenter.new(self) 
end 

然後在您的視圖,你會做這樣的事情:

<h1><%= @user.name %>'s Friends List</h1> 
@user_presenter.friends_list 

我喜歡做這種方式的原因是:

  • 我意見有關於我的模型層的知識(我喜歡分離)
  • 它使我的意見超級笨拙(no lo在我看來,我更喜歡 - 在我的應用程序,意見有只有 html標記(我使用HAML)和呼籲演示者)
  • 如果我對我的模型做任何更改,我不必去回到我的觀點,並進行更改(只要我UserPresenter榮譽friends_list接口)
  • 我覺得輕鬆許多比測試不同的滑軌組件(控制器,視圖測試普通的老式Ruby對象(我所有的Presenters是波羅斯)等等)

關於演示者有一個很好的RailsCast

1

在該域中,您有兩個實體:UserWithFriends和UserWithoutFriends。所以,你需要創建一個UserFactory

class UserWithFriends < User 
    def initialize(user) 
    @user = user 
    end 
    def friend_first_name 
    @user.friends.first.first_name 
    end 
    def friend_last_name 
    @user.friends.first.last_name 
    end 
    def friend_favourite_food 
    @user.friends.first.favourite_food 
    end 

end 

class UserWithoutFriends < User 
    def initialize(user) 
    @user = user 
    end 
    def friend_first_name 
    "N/A" 
    end 
    def friend_last_name 
    "N/A" 
    end 
    def friend_favourite_food 
    "N/A" 
    end 
end 


class UserFactory 
    def initialize(user) 
    @user = user 
    end 

    def create 
    if @user.friends.any? 
     UserWithFriends(@user).new 
    else 
     UserWithoutFriends(@user).new 
    end 
    end 
end 

在控制器

def user 
    @user = UserFactory.new(user.find_by(:id => params[:id])).create 
end 

所以,在視圖中你根本

<h1><%= @user.name %>'s Friends List</h1> 
<table> 
    <tr><%= @user.friend_first_name %></tr> 
    <tr><%= @user.friend_last_name %></tr> 
    <tr><%= @user.friend_favourite_food %></tr> 
</table>