例如,给定一个基本控制器,如:
class PostsController < ApplicationController
def index
@post = Post.all
end
实例变量@post
在视图posts/index.html.erb
中可用,但在部分posts/_index.html.erb
我的主要问题是:这是为什么?如何在控制器中定义部分方法,例如,传递实例变量?
更具体的说明:
我问这个是因为我在一个单独的主视图welcome/index.html.erb
中呈现数据的方式是通过这个帖子部分。我通过在Post.all
部分中直接调用模型posts/_index.html.erb
来解决这个限制,但据我所知,这忽略了MVC架构并严重限制我开发更复杂的方法,除非我真的打破约定并将它们写入视图(我认为它可能有用,但设计很差)。
目前,@ post正在将nil传递给部分符号: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
文章/ _index.html.erb
<% post.reverse.each do |post| %>
<div class="panel panel-default">
<div class="panel-body">
<%= post.text %>
</div>
</div>
<% end %>
文章/ _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 %>
文章/ show.html.erb
<%= @post.text %>
welcome / index.html.erb相关部分(部分)
<%= render partial: "posts/index", locals: {post: @post} %>
<%= render partial: "posts/new" %>
控制器/ 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
答案 0 :(得分:3)
您通过在视图中调用控制器级对象查找来破坏MVC约定是对的。
当你在partial上调用render动作时,你有多个要发送的参数,其中一个是locals
哈希,它接受你想要直接传递给partial的变量。
看起来像这样:
<%= render partial: "something", locals: {posts: @posts} %>
导轨指南是该主题的绝佳资源。更多关于here。