无法在Rails Controller中更改变量属性

时间:2017-04-24 15:17:16

标签: ruby-on-rails

我暂时没有使用过Rails,而且我想要清理它。

因此@符号表示,该控制器视图中可以访问特定的变量。正确的吗?

如果我有路线的意思

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

这意味着无论何时,只要我去路线,它就会前往路线'/admin/user:id'然后它将有权访问该控制器中的所有@variables。正确的吗?

现在这是一个小问题,在JavaScript中通常是一个简单的if-statement

例如,假设我有一个User模型,并希望向好友Friend.first_name,{显示一个小last_name个列表{1}}。我只需要做

即可证明这一点

admins_controller

favourite_food

然后在我的观看中有类似

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

我的问题如果他们没有朋友,我想将所有内容设置为" N / A"。这就是我在控制器中的用法。

<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 ,但我认为这是一种更好的方法,因为创建不必要的宽范围变量并不好。

4 个答案:

答案 0 :(得分:1)

此逻辑属于视图,执行类似此操作

public void onServiceConnected() {

AccessibilityServiceInfo asi = new AccessibilityServiceInfo();
asi.eventTypes = AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED;
asi.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC;

if (Build.VERSION.SDK_INT >= 16) {
                asi.flags = AccessibilityServiceInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS;
}

setServiceInfo(asi);

}

@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
if (event.getPackageName() != null) {
//my code
}

}

答案 1 :(得分: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

我喜欢这样做,因为:

  • 我的观点有关于我的模型层的知识(我喜欢分离)
  • 这让我的观点变得非常愚蠢(视图中没有逻辑,我更喜欢 - 在我的应用中,视图只有 html标记(我使用HAML)并调用演示者)
  • 如果我对模型进行任何更改,我不必返回到我的视图并进行更改(只要我的UserPresenter尊重friends_list界面)
  • 我觉得测试普通的旧ruby对象(我的所有Presenters都是PORO)比测试各种Rails组件(控制器,视图等)要容易得多。

演示者有一个很好的RailsCast

答案 2 :(得分: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>

答案 3 :(得分: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