2012-02-23 2 views
0

У меня есть две модели/контроллеры, которые по существу дублируют данные (только на разных страницах). Когда я перебирать коллекцию на одном из контроллеров, она работает так же, как задумано, однако при запуске коллекции через парциальное на другой контроллер, это создает еще один «объект»Правильная рендеринг Rails частичная по набору предметов

def show (users_controller.rb) 
    ... 
    @missions = @user.missions 
    @mission = current_user.missions.build 
    ... 
end 


def index (missions_controller.rb) 
    ... 
    @missions = @user.missions 
    @mission = current_user.missions.build 
    ... 
end 

Когда я называю render @missions (app/views/mission/_mission.html.erb) на файлах show.html.erb и index.html.erb. Он работает по назначению на Users_controller, но создает дополнительный «объект» на Missions_controller. Кажется, что при рендеринге коллекции отображаются как переменные @mission, так и @missions.

Почему и как я могу это исправить? Я попытался переместить частичный файл в общий каталог просмотра, но проблема остается. Я предполагаю, что это связано с тем, как я назвал переменные экземпляра? Я супер в тупике. Спасибо, ребята

ответ

1

Это только предположение, но я бы сказал, что это, вероятно, происходит, потому что миссия, которую вы строите, включена в @ user.missions. Критерии не оцениваются до тех пор, пока они фактически не используются (путем вызова .all или .each или чего-то еще), поэтому, используя current_user.missions.build, вы добавляете пустую миссию в конец @ user.missions ... при условии, что current_user и @user - то же самое.

Таким образом, вы можете исправить это, изменив вызов на @missions = @user.missions.all, который заставит его немедленно оценить, прежде чем встроенная миссия будет добавлена ​​в конец.

Как я уже сказал, только предположение!

+0

ничего себе, это сработало как очарование! im все еще не уверен почему. Гектометр Имеет ли это какое-то отношение к тому, что вызов '@ mission' происходит от mission_controller? Я смущен тем, почему вызов этой коллекции будет включать переменную '@ mission', а также ... – pruett

+0

Таким образом, user.missions фактически не оценивает, пока не будет использован; он возвращает прокси-сервер ассоциации, который оценивается только после того, как на него вызывается метод, для которого требуются его данные. Поэтому, когда вы говорите @ user.missions, вы говорите: «В какой-то момент, но не сейчас, дайте мне все миссии, связанные с этим пользователем». Затем сразу же вы создаете новую ассоциацию для этого пользователя. Когда вы фактически используете миссии, он выполняет запрос и возвращает все миссии для этого пользователя, ВКЛЮЧАЯ тот, который вы только что создали. Вызов .all немедленно возвращает только те миссии, которые уже сохранены и построены. – Veraticus

+0

спасибо ... его создание немного больше смысла. Любопытно, почему он работает по назначению на одном контроллере, но не на другом? разве он не должен выполнять одно и то же? – pruett

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