From practical perspective, it is always a hard decision where to draw the line between view layer and controller logic. It could be questionable to fill your controller with the likes of:
# controller
@project_names = Project.names
# view
<%= @project_names.join(", ") %>
Only to use the @procject_names in the view.
But keeping that code out from views would give you later the opportunity to do this without changing the view:
# Controller is updated
@project_names = Project.names
# Show only matching projects
if params[:search]
@project_names = @project_names.select{|n| n =~ /#{params[:search]}/}
end
# view - still the same
<%= @project_names.join(", ") %>
Also, take look at the Draper gem which builds upon the
Decorator pattern and ViewModel of the MVVM pattern.
With Draper, you can keep even your controllers cleaner and have multiple decorators for same object depending on the need (e.g one for web, other for mailer) while still using same view code to render output.
Common thing to place in the Decorator is localized dates which depend on logged in user, therefore don't fit into view, but would clutter the controller with view-layer logic.