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

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

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

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

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

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

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

很明显我错过了什么,所以任何见解都会非常感激!

谢谢

相关文件:

 views/ posts/ _index.html.erb _new.html.erb show.html.erb welcome/ index.html.erb controllers/ posts_controller.rb welcome_controller.rb 

文章/ _index.html.erb

  

文章/ _new.html.erb

  

文章/ show.html.erb

  

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

   

控制器/ 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 

控制器/ welcome_controller.rb

 class WelcomeController < ApplicationController end 

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

当您在partial上调用render动作时,您有多个要发送的参数,其中一个是locals哈希,它接受您想要直接传递给partial的变量。

它看起来像这样:

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

导轨指南是该主题的重要资源。 更多关于这一点 。