2012-05-17 97 views
1

這樣的模式:如何創建顯示模型?

create_table "user_accounts", :force => true do |t| 
    t.string "code" 
    t.string "user_name" 
    t.integer "user_type", :default => 1 
end 

控制器的這樣的代碼:

def index 
    @user_accounts = UserAccount.all 

    respond_to do |format| 
    format.html # index.html.erb 
    format.json { render :json => @user_accounts } 
    format.xml { render :xml => @user_accounts } 
    end 
end 

視圖的代碼是這樣的:

<table> 
    <tr> 
    <th><%= t :code %></th> 
    <th><%= t :user_name %></th> 
    <th><%= t :user_type %></th> 
    <th></th> 
    <th></th> 
    <th></th> 
    </tr> 

<% @user_accounts.each do |user_account| %> 
    <tr class="<%= cycle('list_line_odd', 'list_line_even') %>"> 
    <td><%= user_account.code %></td> 
    <td><%= user_account.user_name %></td> 
    <td><%= user_account.user_type %></td> 
    <td><%= link_to 'Show', user_account %></td> 
    <td><%= link_to 'Edit', edit_user_account_path(user_account) %></td> 
    <td><%= link_to 'Destroy', user_account, :confirm => 'Are you sure?', :method => :delete %></td> 
    </tr> 
<% end %> 
</table> 

,一切工作正常。但是有一個缺陷就是'user_type'顯示爲一個數字。但我希望它可以像'普通用戶'或'系統管理員'那樣顯示爲字符串。

我不想在視圖中添加任何邏輯(index.html.erb)的最重要的事情。

所以我需要的是改變控制器或任何地方的user_type的值。

必須有一些優雅的方式來做到這一點。但我不知道,希望你們能給我一些建議。謝謝!

+0

你不想在視圖中甚至功能,將參與用戶類型並返回相應的stirng? – Zakaria

+0

是的,我不想在視圖中添加任何邏輯。對於MVC的最佳實踐,View應該是無邏輯的。所以我希望它可以發生在控制器或模型層。 – LeoShi

+1

在這種情況下,使用視圖幫助器類將是適當的。將'視圖相關的表示邏輯'推入模型類並不總是理想的 - 這就是幫助者存在於rails中的原因。使用助手類是否開放? –

回答

4

您可以添加到您的模型UserAccount一些功能像這樣

def user_type_string 
    case self.user_type 
    when 1 
     return "Super user" 
    when 2 
     return "Something else" 
    else 
    end 
end 

而且這種方法可以在視圖中使用

<td><%= user_account.user_type_string %></td> 
+1

除了這個或任何其他解決方案,是否有什麼像在軌道viewmodels? 例如我有一個表有FK從2表,我想顯示只是一個用戶名字段,而不是搜索和填充它自己的ID,併爲其他FK我想顯示的東西列表,而不是自己添加密鑰邏輯。有沒有像.net mvc一樣的viemodel? –

0

首先,你必須定義它爲一個數字:

t.integer "user_type", :default => 1 

所以,你需要或者將其定義爲你想呈現,或有其轉換邏輯的字符串。

我建議建立一個/app/helpers/user_accounts_helper.rb文件像這樣:

module UserAccountsHelper 

    def account_type_display(account_type) 
    // put logic here to convert the integer value to the string you want to display 
    end 

end 

然後更改您的視圖文件呈現的賬戶類型,以行:

<td><%= account_type_display(user_account.user_type) %></td> 

這應該工作。

+0

如上所述,他不想要那種方法。 – Zakaria

+0

我沒有看到他在哪裏說使用視圖助手是他不想要的。你能指出嗎?他說他不想要邏輯 - 這是完成的。 **該功能不在視圖**中。 –

+0

如果我理解他的請求,他認爲'account_type_display'調用是一個邏輯。 – Zakaria

相關問題