为什么控制器方法中定义的实例变量不在相应的部分中可用?
例如,给定一个基本控制器,例如:
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} %>
导轨指南是该主题的重要资源。 更多关于这一点 。