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' の 'create' アクションで定義されておらず、代わりに 'posts_controller' で定義されています。明らかに、コードを繰り返しても DRY にはなりません。

別のコントローラーから変数を参照するようにビューに指示する方法はありますか? IE: 'hides_controller' ではなく 'posts_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

hidden_​​controllerをposts_controllerのサブクラスにすることができます。すなわち

post_controller.rb:

class PostsController < ApplicationController
def create
   @posts = Post.all()
end

hidden_​​controller.rb:

class HidesController < PostsController
def create
  super
  #whatever
end

これで、@postsがHidesビューで利用できるようになります

あなたのコメントに応じて更新

私はあなたにいくつかの選択肢があると思います、1つは乾燥にあまり夢中にならないことです、あなたが@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 に答える