2017-04-24 13 views
-1

私はしばらくのうちにRailsを使用しておらず、クリアしたいものがあります。Railsコントローラの変数属性を変更できません

したがって、@シンボルは、コントローラビュー内で変数の変数にアクセスできることを示しています。正しい?

私はこれは私がルートに行く時はいつでも、ルート'/admin/user:id'に行くために起こっていることを意味

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

ルートを持っている場合意味し、それはその中のすべての@variablesへのアクセスを持っていますコントローラ。正しい?

これは私が持っている小さな問題ですが、これは通常JavaScriptで単純なif-statementになります。例えば

は、私がUserモデルを持っていると言うと私は友人.first_namelast_namefavourite_foodと小さなFriendの一覧を表示します。私はが場合、彼らは「ドンということですが

<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]) 
end 

とを

admins_controllerをすることによって、これを表示することができます友人がいないので、すべてを "該当なし"に設定したい。これが私のコントローラーでどうやって起こったかです。

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 

を私はこのようにそれをやって好きなので:

  • マイビューはゼロ私のモデルの層についての知識(私は分離が好きです)
  • それは私の意見をsuper-dumb (私はHAMLを使用しています)
  • 私のモデルに何か変更を加えても、私は行かなくてもいいのですが
  • (私のPresentersはすべてPOROです)普通の古いルビオブジェクトをテストするのがずっと簡単です。さまざまなRailsコンポーネント(コントローラ、ビューなど)

プレゼンターにはRailsCastがあります。

1

このドメインには、UserWithFriendsとUserWithoutFriendsという2つのエンティティがあります。ですから、コントローラそう

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

で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 

を作成する必要があり、あなたは、単に

<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> 
関連する問題