2016-09-19 54 views
0

對Rails有點新鮮感,並試圖找出一些問題的答案我一直沒有真正的運氣使用Rails文檔或導軌指南,或鐵軌教程。Rails 5:重構 - 一對多關係(測試和視圖)

我的目標是擁抱rails如何處理事情,並嘗試讓其他開發人員稍後再進入該項目。

問題1:重構問題在重構

Rails的做法。我不確定這是否應該在模型或控制器中進行,並且真的只是想知道控制器中的哪些項目應與模型中的內容相匹配。

第一次迭代:

<% @departments.each do |department| %> 
     <tr> 
     <td><%= department.name %></td> 
     <td><%= department.description %></td> 
     <td> 
      <%= library = Library.find_by(id: department.library_id).name %> 
     </td> 
     <td><%= link_to 'Show', department %></td> 
     <td><%= link_to 'Edit', edit_department_path(department) %></td> 
     <td><%= link_to 'Destroy', department, method: :delete, data: { confirm: 'Are you sure?' } %></td> 
     </tr> 
    <% end %> 

這似乎我錯了,並似乎應該取出一部分作爲後端邏輯。

第二次迭代:

型號

class Department < ApplicationRecord 
    belongs_to :library 

    def get_library_name(lib_id) 
    library = Library.find_by(id: lib_id) 
    return library.name 
    end 
end 

查看

<% @departments.each do |department| %> 
     <tr> 
     <td><%= department.name %></td> 
     <td><%= department.description %></td> 
     <td> 
      <%= department.get_library_name(department.library_id) %> 
     </td> 
     <td><%= link_to 'Show', department %></td> 
     <td><%= link_to 'Edit', edit_department_path(department) %></td> 
     <td><%= link_to 'Destroy', department, method: :delete, data: { confirm: 'Are you sure?' } %></td> 
     </tr> 
    <% end %> 

這種感覺更正確,但不是所有的方式出現,所以我真的不知道我該怎麼改它更加正確,特別是因爲列出記錄的索引視圖非常相似。

我應該如何重構這個?

問題2:我未通過檢測

無論哪種方式,我的測試不及格。我猜這是我使用我的一對多關係的方式。

test "should get index" do 
    get departments_url 
    assert_response :success 
    end 

錯誤:

DepartmentsControllerTest#test_should_get_index: 
ActionView::Template::Error: undefined method `name' for nil:NilClass 
    app/models/department.rb:6:in `get_library_name' 
    app/views/admin/departments/index.html.erb:21:in `block in _app_views_admin_departments_index_html_erb__1894713831414342893_57284960' 
    app/views/admin/departments/index.html.erb:16:in `_app_views_admin_departments_index_html_erb__1894713831414342893_57284960' 
    test/controllers/departments_controller_test.rb:11:in `block in <class:DepartmentsControllerTest>' 

回答

1

問題1:

您可以輕鬆地訪問查詢使用關聯方法相關的庫中。

每當你添加belong_to :libraryDepartment,你真的只是創造上的Department調用相應的查詢您的實例名爲library方法。

對於has_many,has_onehas_and_belongs_to_many關聯也會發生相同的情況,期望發生相反情況。

而不是尋找Library.find_by(id: department.library_id)它做相反的,Department.find_by(library_id: department.library_id)

所有這些都可以通過關聯方法輕鬆訪問。

department = Department.first 
library = department.library 

爲了回到這個問題,我個人喜歡將最大的數據集暴露給我的觀點,並從那裏縮小範圍。

我只會發送一個@department,以查看,而不是打擾創建一個方法來顯示名稱或delegate名稱從庫到部門(帶前綴)以獲得library_name方法。

<% @departments.each do |department| %> 
    <tr> 
    <td><%= department.name %></td> 
    <td><%= department.description %></td> 
    <td><%= department.library.name %></td> 
    <td><%= link_to 'Show', department %></td> 
    <td><%= link_to 'Edit', edit_department_path(department) %></td> 
    <td><%= link_to 'Destroy', department, method: :delete, data: { confirm: 'Are you sure?' } %></td> 
    </tr> 
<% end %> 

問題2:

不幸的是,我沒有太多的答案。問題是幾乎沒有什麼信息需要處理,但是現在我們涉及到很多可能發送的方法,而且無法使用多米諾骨牌方法,直到您的模型方法。

我強烈懷疑您的某個部門沒有library_id,這會導致您的循環崩潰,因爲它取決於具有庫的每個部門。

編輯

問題3:

要獲得的反比關係,你根本就department.libraries

在你描述的情況下,你有一個部門集合,它與單個部門實例不同。

+0

這工作完美和一個很好的解釋。我要標記你的答案是否正確,但是如果我想讓所有部門都列在我的圖書館視圖中,你能解釋一下嗎?當檢查指向Library.all的@libraries項目時,我沒有看到任何部門。 –

+0

我實際上在我的庫中創建了一個用於獲取部門的類。 '''def departments departments = Department.where(:library_id => self.id) end''' –

+0

@ DavidJ.Davis更新我的回答 – fbelanger