访问另一个控制器中的变量进行查看

时间:2012-05-02 15:01:00

标签: jquery ruby-on-rails ajax

我有一个Ruby on Rails项目,我正在使用ajax来更新页面上的几个部分。我有一个posts_controller,可以帮助显示一组帖子。每个帖子都可以通过hides_controller“隐藏”和“取消隐藏”。此外,该页面还显示了显示的帖子数量。例如,当我正式加载页面时,它显示“显示5个帖子”。

一旦用户选择隐藏帖子,我就设置了ajax隐藏帖子;但是,视图(由posts_controller呈现)不会将“显示的5个帖子”位更新为“显示的4个帖子”。我在“create.js.haml”文件中写了以下ajax,并认为它可以解决它:

:plain
  $(".post#{@post.id}_container").hide("drop", { direction: "up" }, 'fast');  
  $(".post_counter").html("#{escape_javascript(render('users/posts/hide'))}");

users / posts / hide.html.haml:

%h6= "#{@posts.size} posts shown"

我遇到的问题: @posts未在'hides_controller''create'操作中定义,而是在'posts_controller'中定义。显然重复代码并不会使它非常干。

有没有办法告诉视图引用另一个控制器的变量? IE:从'posts_controller'而不是'hides_controller'中找到@posts变量?

非常感谢您的帮助。谢谢你的时间!

控制器结构:

**controllers (folder)**
  posts_controller.rb
  hides_controller.rb
  **users (folder)**
    posts_controller.rb

posts_controller.rb(在父[conrollers]文件夹中):

class PostsController < ApplicationController
  code
end

posts_controller.rb(在child [user]文件夹中):

class Users::PostsController < PostsController
  def update
    @posts is defined here
  end
end

hides_controller.rb:

class HidesController < ApplicationController
  def create
    code
  end
end

1 个答案:

答案 0 :(得分:0)

你可以使hides_controller成为posts_controller的子类。即。

posts_controller.rb:

class PostsController < ApplicationController
def create
   @posts = Post.all()
end

hides_controller.rb:

class HidesController < PostsController
def create
  super
  #whatever
end

所以@posts现在可以在你的隐藏视图中找到

更新以回应您的评论

我认为你有几个选择,一个是不要太干扰Dryness,没有什么能阻止你重复@posts =?在hides_controller中。除非@posts =?相当复杂。

或者,您可以移动@posts =的定义?升级到顶级posts_controller,如果它们是相同的。

或者你可以从Users :: PostController继承hides_controller,并创建一个特定于加载@posts的新动作

class PostController < ApplicationController
  before_filter :loadposts, :only=>[:update]
  def loadposts
    @posts = ?
  end
end
class Users::PostsController < PostController
end
class HidesController < Users::PostsController
  before_filter :loadposts, :only=>[:create]
end

您可以决定为所需的任何操作运行装载点,即

before_filter :loadposts, :only=>[:create,:update]

before_filter :loadposts , :except=>[:index,:new]