2012-05-02 9 views
0

私はRuby on Railsプロジェクトを持っており、ページ上のいくつかの部分を更新するためにajaxを使用しています。私は投稿のセットを表示するのに役立つposts_controllerを持っています。それぞれの投稿には、hides_controllerを介して「非表示」および「非表示」する機能があります。さらに、このページには表示されている投稿数が表示されます。たとえば、ページを最初にロードすると、「5つの投稿が表示されます」と表示されます。ビューを介して別のconrollerの変数にアクセスする

ユーザーが非表示にすると投稿を非表示にするように設定しました。しかし、(posts_controllerによってレンダリングされた)ビューは、 "5 posts posts"ビットを "4 posts posts"に更新しません。私は "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: 'hides_controller'の代わりに 'posts_controller'から@posts変数を探しますか?

お手数をおかけします。あなたの時間をありがとう!

コントローラの構造:(親[conrollers]フォルダ内)

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

posts_controller.rb:(子で[ユーザー]フォルダ)

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 

だから今、あなたのコメント

に応じて

UPDATEあなたの隠しビューで利用できる意志を@posts

私はあなたがいくつかの選択肢を持っていると思う、1つはあまりにも乾いて、 @posts =を繰り返すことからあなたを妨げるものは何もない? hides_controllerにあります。 @posts =ですか?かなり複雑です。

または、@ postst =の定義を移動するだけでもかまいません。それらが同じであればトップレベルのposts_controllerに移動します。

それとも、あなたはすなわち

before_filter :loadposts, :only=>[:create,:update] 
、あなたが望む任意のアクションのloadpostsを実行することを決定することができます::ユーザーからの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 , :except=>[:index,:new] 
+0

私はこれが好きですが、私のコントローラの構造は少し異なります。オリジナルのポストでコントローラの設定を参照してください。 hides_controllerをUser :: posts_controllerのサブクラスにする必要がありますか?手伝ってくれてどうもありがとう! –

+0

また、@postsは '更新'アクションで定義され、 '作成'アクションでは定義されません。 –