为什么在控制器的方法中定义的实例变量在相应的部分中不可用?
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.
例如,给定一个基本控制器,例如:
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.