2017-04-24 63 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>