0

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

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

: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”“创建”操作中定义,而是在“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
4

1 回答 1

0

您可以将 hides_controller 设为 posts_controller 的子类。IE

post_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]
于 2012-05-02T15:47:45.987 回答