Частицы не являются просмотрами.
Части не могут быть отображены как представления. Это имеет смысл, так как частичные не являются представлениями - они представляют собой фрагменты многократного использования.
Допустим, у вас есть:
# app/controllers/posts_controller.rb
class PostsController < ApplicationController
def new
@post = Post.new
end
end
# app/views/posts/new.html.erb
<%= form_for(@post) do |f| %>
# ...
<% end %>
Если вы переименуете new.html.erb
-> _new.html.erb
Rails больше не сможет найти представление - потому что оно больше не является представлением.
Могут ли партиалы быть специфичными для контроллера?
Частицы по природе очень специфичны для контроллера. Например:
# app/views/posts/show.html.erb
<%= render partial: 'foo' %>
Будет искать app/views/posts/_foo.html.erb
.
# app/views/stories/show.html.erb
<%= render partial: 'foo' %>
будет искать app/views/stories/_foo.html.erb
.
Это потому, что Rails добавляет путь поиска к представлению с app/views/controller_name
.
Можно ли публиковать просмотры?
Да. Но вам нужно явно указать Rails, где находится представление.
# app/controllers/posts_controller.rb
class PostsController < ApplicationController
def new
@resource = Post.new
render 'resources/new'
end
end
# app/controllers/stories_controller.rb
class StoriesController < ApplicationController
def new
@resource = Story.new
render 'resources/new'
end
end
Или вы можете добавить путь просмотра .
class ResourcesController < ApplicationController
prepend_view_path Rails.root.join('app/views/resources')
end
class PostsController < ResourcesController
def new
@resource = Post.new
# will now default to rendering `app/views/resources/new.html.erb`
end
end
Можно ли открыть общий доступ к частям?
Да. Но вы должны сообщить Rails, где находится частичное.
<%= render partial: 'shared/social_media_icons' %>