2012-05-02 108 views
0

我有一个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'))}"); 

用户/职位/ 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(在儿童[用户]文件夹):

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

hides_controller .rb:

class HidesController < ApplicationController 
    def create 
    code 
    end 
end 

回答

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可将在你隐藏的观点

UPDATE响应您的评论

我想你有几个选择,一个是不要太过于挂在干燥,t这并不妨碍你重复@posts =?在hides_controller中。除非@posts =?相当复杂。

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

或者你也可以从用户:: 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 

新的动作,您可以选择继续执行你想要的任何行动loadposts,即

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

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

我喜欢这个,但我的控制器结构有点不同。请参考我的原始文章中的控制器设置。我应该让hides_controller成为User :: posts_controller的子类吗?非常感谢你的帮助! –

+0

另外,@posts是在'update'操作中定义的,而不是在'create'操作中定义的。 –

相关问题