2012-05-02 2 views
0

У меня есть проект Ruby on Rails, и я использую ajax для обновления нескольких частей на странице. У меня есть post_controller, который помогает отображать набор сообщений. Каждый пост имеет возможность быть «скрытым» и «незакрытым» через hides_controller. Кроме того, на странице отображается количество отображаемых сообщений. Например, когда я загружаю страницу, она говорит «5 сообщений, показанных».Доступ к переменной в другой системе с помощью вида

Я настроил ajax, чтобы скрыть сообщение, когда пользователь выбирает его скрыть; однако представление (отображаемое post_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: найдите переменную @posts из «posts_controller» вместо «hides_controller»?

Ваша помощь очень ценится. Спасибо за ваше время!

Контроллер Структура:

**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 

Так что теперь @posts воли доступны в ваших взглядах Шкуры

UPDATE в ответ на ваш комментарий

Я думаю, у вас есть несколько вариантов, один из них - не слишком зависеть от сухости, т здесь ничего не мешает вам просто повторять @posts =? в hides_controller. Если @posts =? является довольно сложным.

Или вы могли бы просто переместить определение @posts =? до верхнего уровня posts_controller, если они одинаковы.

Или вы можете создать подкласс hides_controller от пользователей :: PostController, и создать новое действие, специфичную для загрузки @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 

Вы можете решить, запускать loadposts для каких-либо действий, которые вы хотите, то есть

before_filter :loadposts, :only=>[:create,:update] 

или

before_filter :loadposts , :except=>[:index,:new] 
+0

Мне это нравится, но моя структура контроллера немного отличается. Пожалуйста, обратитесь к настройке контроллера в моем исходном сообщении. Должен ли я сделать hides_controller подклассом User :: posts_controller? Большое вам спасибо за вашу помощь! –

+0

Кроме того, @posts определяется в действии «update», а не в действии «create». –

Смежные вопросы