Могут ли партиалы быть специфичными для контроллера? - PullRequest
0 голосов
/ 14 января 2019

В Rails могут ли партиалы быть специфичными для контроллера? У меня есть контроллер для создания поста и просмотра, который пошел с ним. После того, как я переименовал вид (добавил _), чтобы сделать его частичным, он больше не работает.

Заранее спасибо.

1 Ответ

0 голосов
/ 14 января 2019

Частицы не являются просмотрами.

Части не могут быть отображены как представления. Это имеет смысл, так как частичные не являются представлениями - они представляют собой фрагменты многократного использования.

Допустим, у вас есть:

# 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' %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...