On Apr 19, 2009, at 4:16 PM, [email protected] wrote:
> Hi
>
> When creating a view to display infromation obtained from a model,
> should the view always get this information from the controller, or
> should it get it directly from the model?
>
> For example, say I have Class and Student models, and they are in a
> many to many relationship via the enrolled table. Now my view wants to
> display the students of a given class. Should the controller run the
> query and store it in a variable (say @students) that is passed to the
> view? Or, should the view just access it directly like
>
> <% for enrolled in @class.enrolled_students %>
> <%= enrolled.student.name %>
>
> I like the second way because it does not require me to put any code
> in the controller. I just feel like this is coupling the view and to
> the model and I can't tell if that is a bad thing in an MVC framework?
> I feel like it is.
>
> Thanks in advance
Well, except that you may find an iterator better:
<% @class.enrolled_students.each do |enrolled| %>
<%= enrolled.student_name %>
<% end %>
In you controller, you probably want to tell ActiveRecord that you'll
be using enrolled_students, but this is just for performance. It will
work in the view as is.
@class = Class.find(params[;id], :include => :enrolled_students)
and note that I've subtly suggested that you don't chain the method
calls in the view (ask Google or Wikipedia about the "Law of Demeter")
class EnrolledStudent
def student_name
self.student ? self.student.name : "anonymous"
end
end
This lets you avoid NoMethodError exceptions if (when!)
enrolled.student is nil
-Rob
Rob Biedenharn http://agileconsultingllc.com
[email protected]
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "Ruby
on Rails: Talk" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---