2014-09-09 1 views
6

Я отменяю действие создания устройства Registrations Controller. У меня есть две формы для регистрации, отдельных или компаний, у компании есть поле под названием company_form, установленное в true, которое отличает две формы.Рельсы рендеринга частичного и компоновки в контроллере

После проверки формы мне нужна правильная форма для рендеринга (ранее она возвращалась к форме по умолчанию, независимо от того, какую форму я использовал).

У меня возникла проблема, когда визуализируется только частичное (очевидно, поскольку я только показываю частичное), но мне нужен также макет/файл приложения.

class RegistrationsController < Devise::RegistrationsController 
    def create 
    <!-- Other devise code here --> 
    if resource.company_form 
     render partial: 'shared/company_signup_form' 
    else 
     render partial: '/shared/individual_signup_form' 
    end 
    end 
end 

Я попытался

if resource.company_form 
    render partial: 'shared/company_signup_form', layout: 'layouts/application' 
    else 
    render partial: '/shared/individual_signup_form', layout: 'layouts/application 
    end 

Но я получаю сообщение об ошибке

Template is missing 
Missing partial layouts/_application 

Почему это выглядящий для частичного _application, когда я указал расположение и как я могу получить правильное расположение к применяется

Thanks

Редактировать

Читая документацию, говорит

«Обрати внимание, что макеты для обертонов следовать тому же опережените подчеркиванию имен, как регулярные партиалов, и помещаются в той же папке, парциальный, что они принадлежат (не в папке мастер-макетов). "

Но я хочу, расположение по умолчанию будет применяться

+0

макеты/приложения предполагают, чтобы работать для всех частичной или любой страницы вашего рендерите, это главная страница вашего модуля просмотра. Если вы хотите разный макет для двух разных ситуаций, вы можете написать одно условие в контроллере приложения –

+0

ну, это то, что я на самом деле просто хочу, чтобы макет был рендерингом, но он не делает – Richlewis

+0

http://api.rubyonrails.org/classes/ActionView /PartialRenderer.html использовать это для ref, может это решить вашу проблему –

ответ

5

Частичный рендеринг в контроллере чаще всего используется вместе с Ajax вызовов, которые только обновить один или несколько элементов на странице без перезагрузки. Оказание частичных действий с контроллером позволяет использовать один и тот же частичный шаблон как для полностраничного рендеринга (путем вызова его из шаблона), так и при возникновении обновлений подстраницы (из действия контроллера, отвечающего на вызовы Ajax). По умолчанию текущий макет не используется.

Возможно, это причина, по которой ваш код не работает, вы можете использовать шаблон рендеринга.

Обработка чертежей работает так же, как и рендеринг действий, за исключением того, что он принимает путь относительно корня шаблона. Текущий макет автоматически применяется.

if resource.company_form 
    render :template => "shared/company_signup_form" 
else 
    render :template => "shared/individual_signup_form" 
end 

** СНИМАЙТЕ ПОДРОБНЕЕ от имени вашего партнера, потому что вы используете это как шаблон.

Надеюсь, что это сработает!

+0

, к сожалению, нет, макеты/приложение получают визуализированный дважды, а частичный вообще не отображается вообще – Richlewis

+0

проверяет отредактированный ответ, надеюсь, что это сработает для вас –

+0

Спасибо, узнали что-то новое о шаблонах сегодня, ваш ответ работает и намного эффективнее и более «The Rails way» – Richlewis

2

В конце концов (и я знаю, что это хак), но я создал частичную под названием _partial_layout_wrapper в моих макетах, который был точной копией раскладок/файла приложения и использовать это в моем контроллере

render partial: 'shared/company_signup_form', layout: 'partial_layout_wrapper' 

это работает, но, конечно, это не может быть так?

1

Не могли бы вы разместить весь контроллер? Rails отображает по умолчанию layout/application.html.erb, если другой макет не указан.

Из направляющих ROR:

Частичные Макеты

Неполный может использовать свой собственный файл макета, так же, как вид можно использовать макет. Например, вы могли бы назвать частичным, как это:

<%= render partial: "link_area", layout: "graybar" %> 

Это будет выглядеть для частичного имени _link_area.html.erb и сделать его с использованием макета _graybar.html.erb. Обратите внимание, что макеты для партитур следуют за тем же наименованием ведущего подчеркивания, что и обычные частичные, и являются , расположенными в той же папке с частичной принадлежностью (не в папке мастер-макетов).

Также обратите внимание, что при передаче явно необходимо указать частичное, например: макет.

Так render partial: 'shared/company_signup_form', layout: 'layouts/application' ищет макеты/_application.html.erb