局部变量可以特定于控制器吗?

时间:2019-01-14 01:12:01

标签: ruby-on-rails

在Rails中,局部变量可以特定于控制器吗?我有一个用于创建帖子的控制器和一个附带的视图。我将视图重命名(添加了_)以使其成为局部视图后,它似乎不再起作用。

先谢谢您。

1 个答案:

答案 0 :(得分:2)

部分不是视图。

部分不能呈现为视图。完全合理,因为局部视图不是视图-它们是视图的可重用块。

让我们说您拥有:

# 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

或者您可以append the view path

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' %>