2012-05-02 7 views
0

Ruby on Rails 프로젝트가 있고 페이지의 여러 부분을 업데이트하는 데 아약스를 사용하고 있습니다. 게시물 집합을 표시하는 데 도움이되는 posts_controller가 있습니다. 각 게시물에는 hides_controller를 통해 '숨김'및 '숨김 해제'할 수있는 기능이 있습니다. 또한이 페이지에는 표시된 게시물 수가 표시됩니다. 예를 들어 페이지를 처음로드 할 때 "표시된 5 개의 게시물"이라고 표시됩니다.뷰를 통해 다른 컨트롤러에서 변수에 액세스하기

사용자가 숨기기를 선택하면 게시물을 숨기기 위해 ajax를 설정했습니다. 그러나 (posts_controller가 렌더링 한)보기는 "표시된 5 개의 게시물"비트를 "표시된 4 개의 게시물"비트로 업데이트하지 않습니다. 나는 "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'에 정의되어 있습니다. 분명히 코드를 반복해도 매우 건조하게되지는 않습니다.

다른 컨트롤러에서 변수를 참조하도록 뷰에 지시하는 방법이 있습니까? 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 

답변

0

hides_controller를 posts_controller의 하위 클래스로 만들 수 있습니다. 즉

posts_controller.rb :

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

:

class HidesController < PostsController 
def create 
    super 
    #whatever 
end 

은 이제 귀하의 코멘트

을에 응답하여 숨기보기에

UPDATE를 사용할 수 의지를 @posts

나는 여러 가지 선택이 있다고 생각한다. 하나는 너무 건조하지 않아야한다. @posts =를 반복하는 것을 막을 수있는 방법은 없습니다. hides_controller에 있습니다. @posts =가 아닌 한? 다소 복잡합니다.

또는 @posts =?의 정의를 이동할 수 있습니다. 동일한 경우 최상위 posts_controller로 이동하십시오.

또는 사용자 : PostController에서 hides_controller를 서브 클래스 및

before_filter :loadposts, :only=>[:create,:update] 
즉, 당신은 당신이 원하는 어떤 행동에 대한 loadposts을 실행하도록 결정할 수 있습니다 로딩 @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는 '생성'작업이 아니라 '업데이트'작업에서 정의됩니다. –

관련 문제