Etwas Neues zu Schienen und versuchen, einige Antworten zu Fragen zu finden, die ich mit keinem wirklichen Glück mit der Rails-Dokumentation oder auf den Schienen geführt habe, oder Schienen Tutorials.Rails 5: Refactoring - Eine-zu-viele-Beziehung (Tests und Ansichten)
Mein Ziel ist es zu begreifen, wie Schienen mit Dingen umgehen und anderen Entwicklern den Einstieg in das Projekt zu erleichtern.
Frage 1: Refactoring Frage
Rails Praxis in Refactoring. Ich bin mir nicht sicher, ob dies in das Modell oder den Controller gehen sollte und möchte wirklich nur wissen, welche Elemente in den Controller gehen sollten, im Vergleich zu dem, was in dem Modell gehen soll.
Erste Iteration:
<% @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 %>
Das schien mir falsch und schien so aus, dass ein Teil als Back-End-Logik genommen werden sollte.
Zweite Iteration:
Modell
class Department < ApplicationRecord
belongs_to :library
def get_library_name(lib_id)
library = Library.find_by(id: lib_id)
return library.name
end
end
Ansicht
<% @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 %>
Das fühlt sich mehr richtig, aber nicht den ganzen Weg gibt, so bin ich nicht wirklich sicher, wie ich das ändern kann es ist korrekter, zumal die Indexansicht, die die Datensätze auflistet, sehr ähnlich ist.
Wie sollte ich dies umgestalten?
Frage 2: My Test nicht
So oder so vergehen will, ist mein Test besteht nicht. Ich schätze, es ist die Art, wie ich meine Eins-zu-Viele-Beziehungen nutze.
test "should get index" do
get departments_url
assert_response :success
end
Fehler:
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>'
das funktionierte perfekt und eine großartige Erklärung. Ich werde Ihre Antwort korrekt markieren, aber könnten Sie die Umkehrung erklären, wenn ich alle Abteilungen in meine Bibliotheksansicht aufnehmen lassen möchte? Wenn ich das @ libraries-Element überprüfe, das auf "Library.all" zeigt, sehe ich keine Abteilungen. –
Ich habe tatsächlich eine Klasse in meiner Bibliotheksmethode erstellt, um die Abteilungen zu bekommen. '' 'def-Abteilungen departments = Department.where (: library_id => self.id) ende''' –
@ DavidJ.Davis Meine Antwort aktualisiert – fbelanger