为什么在控制器的方法中定义的实例变量在相应的部分中不可用?

Why aren't instance variables defined in a controller's methods available in the corresponding partials?

例如,给定一个基本控制器,例如:

class PostsController < ApplicationController
  def index
    @post = Post.all
  end

实例变量 @post 在视图 posts/index.html.erb 中可用,但部分 posts/_index.html.erb

不可用

我的主要问题是:这是为什么?以及如何为控制器中的部分定义方法,例如,传递实例变量?

更具体的说明: 我问这个是因为我在单独的主视图 welcome/index.html.erb 中呈现数据的方式是通过这个 posts 部分。我通过在 posts/_index.html.erb 部分直接调用带有 Post.all 的模型来绕过这个限制,但据我所知,这忽略了 MVC 架构并严重限制了我开发更复杂的方法,除非我真的打破了约定并将它们写入视图(我认为这可能有效但设计不佳)。

目前,@post 将 nil 传递给部分符号 :post in welcome/index.html.erb

显然我遗漏了一些东西,所以任何见解都将不胜感激!

谢谢

相关文件:

views/
  posts/
    _index.html.erb
    _new.html.erb
    show.html.erb
  welcome/
    index.html.erb

controllers/ 
  posts_controller.rb
  welcome_controller.rb

posts/_index.html.erb

<% post.reverse.each do |post| %>
  <div class="panel panel-default">
    <div class="panel-body">
      <%= post.text %>
    </div>
  </div>
<% end %>

posts/_new.html.erb

<%= form_for :post, url: posts_path do |f| %>
  <p id="post_box">
    <%= f.text_area :text %>
  </p>

  <p>
    <%= f.submit %>
  </p>
<% end %>

posts/show.html.erb

<%= @post.text %>

welcome/index.html.erb相关部分(partials)

<%= render partial: "posts/index", locals: {post: @post} %>
<%= render partial: "posts/new" %>

controllers/posts_controller.rb

class PostsController < ApplicationController
  def new
  end

  def create
    @post = Post.new(post_params)

    @post.save
    redirect_to '/'
  end

  def show
    @post = Post.find(params[:id])
  end

  def index
    @post = Post.all
  end

  private
    def post_params
      params.require(:post).permit(:text)
    end

end

controllers/welcome_controller.rb

class WelcomeController < ApplicationController
end

你是对的,你通过在你的视图中调用控制器级对象查找来打破 MVC 约定。

当您在部分调用渲染操作时,您有多种参数要发送,其中之一是 locals 散列,它采用您想要直接传递到部分的变量。

看起来像这样:

<%= render partial: "something", locals: {posts: @posts} %>

rails 指南是有关该主题的重要资源。更多关于 here.