【问题标题】:accessing a variable in another conroller via view访问另一个控制器中的变量以查看
【发布时间】:2012-05-03 02:19:10
【问题描述】:

我有一个 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”“创建”操作中定义,而是在“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

【问题讨论】:

    标签: jquery ruby-on-rails ajax


    【解决方案1】:

    您可以将 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]
    

    【讨论】:

    • 我喜欢这个,但我的控制器结构有点不同。请参考我原帖中的控制器设置。我应该让 hides_controller 成为 User::posts_controller 的子类吗?非常感谢您的帮助!
    • 另外,@posts 是在“更新”操作中定义的,而不是在“创建”操作中。
    猜你喜欢
    • 2017-03-23
    • 2016-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    • 2018-07-01
    • 1970-01-01
    相关资源
    最近更新 更多