我有一个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
答案 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]