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

时间:2015-01-28 03:16:49

标签: ruby-on-rails ruby ruby-on-rails-4 scope partials

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

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

1 个答案:

答案 0 :(得分:3)

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

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

看起来像这样:

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

导轨指南是该主题的绝佳资源。更多关于here