2016-09-19 2 views
0

레일에 다소 새로운 내용으로 레일 설명서 또는 레일 가이드를 사용하여 실제 운이 없었던 질문에 대한 답을 얻으려고 시도하거나 레일 튜토리얼.레일 5 : 리팩터링 - 일대 다 관계 (테스트 및 뷰)

내 목표는 레일스가 일을 처리하는 방법을 포용하고 나중에 다른 개발자가 프로젝트에 쉽게 들어갈 수 있도록하는 것입니다.

질문 1 : 리팩토링 질문 리팩토링에

레일 연습. 이것이 모델이나 컨트롤러에 있어야하고 컨트롤러에서 어떤 아이템이 있어야하는지, 모델에서 무엇이 있어야 하는지를 정말로 알고 싶지는 않습니다.

첫 번째 반복은 :

<% @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 :

당신은 쉽게 연결 방법을 사용하여 관련 라이브러리에 대한 쿼리를 액세스 할 수 있습니다. 당신이 Departmentbelong_to :library를 추가 할 때마다

, 당신은 정말 당신을 위해 해당 쿼리를 호출 Department의 인스턴스에 library라는 방법을 만드는.

has_many, has_one 또는 has_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을 보내고 library_name 방법을 얻을 수있는 이름이나 (접두사) 부서 라이브러리에서 delegate 이름을 표시하는 방법을 만드는 귀찮게하지 않을 것입니다. 질문 2

<% @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 %> 

:

은 불행히도, 난 대답을 많이 필요가 없습니다. 문제는 작업 할 정보가 거의 없다는 것입니다.하지만 이제는 전송할 수있는 많은 메소드가 포함되어 있으며 domill 메소드를 사용하여 모델 메소드로 도미노 할 수 있습니다.

부서 중 하나에 library_id이없는 것으로 의심됩니다. 라이브러리가있는 각 부서에 따라 루프가 충돌합니다.

편집

질문 3 :

역의 관계를 얻으려면, 당신은 단순히 department.libraries을한다.

위에서 설명한 상황에서는 단일 부서 인스턴스와 다른 부서의 콜렉션이 있습니다.

+0

이것은 완벽하고 훌륭한 설명이었습니다. 귀하의 답변을 정확하게 표시하겠습니다 만, 모든 부서를 내 라이브러리보기에 나열하려면 역으로 설명 할 수 있습니까? Library.all을 가리키는 @libraries 항목을 검사 할 때 어떤 부서도 보이지 않습니다. –

+0

사실 저는 도서관을 통해 부서를 확보하는 클래스를 만들었습니다. '''def 부서들 부서 = Department.where (: library_id => self.id) end''' –

+0

@ DavidJ.Davis 업데이트 내 대답 – fbelanger