2013-07-17 3 views
0

Я новичок в рельсах и по-прежнему работаю над фундаментальными принципами, поэтому любые советы и советы очень ценятся!относительно использования рендера в рубине на рельсах

Я создал функциональную страницу контакта на веб-сайте, и я хотел бы иметь возможность отображать форму и функциональность внутри вкладки на другой странице. У меня есть следующий код в папке static_pages в моей папке просмотров:

<div id="tabs"> 
<ul> 
    <li><a href="#tabs-1">About</a></li> 
    <li><a href="#tabs-5">Contact</a></li> 
</ul> 
    <div id="tabs-1"> 
    <%= render "shared/about"%> 
</div> 
<div id="tabs-5"> 
    <%= render "contact/new"%> 
</div> 

< где% = штукатурка «контакт/новый»%> соответствует new.html.erb файла в контакте в представлениях.

соответствующий код внутри моего routes.rb является

match 'contact' => 'contact#new', :as => 'contact', :via => :get 
match 'contact' => 'contact#create', :as => 'contact', :via => :post 

и вот мой контроллер:

class ContactController < ApplicationController 

    def new 
    @message = Message.new 
    end 

    def create 
    @message = Message.new(params[:message]) 

    if @message.valid? 
     NotificationsMailer.contact_pr(@message).deliver 
     redirect_to(root_path, :notice => "Message was successfully sent.") 
    else 
     flash.now.alert = "Please fill all fields." 
    render :new 
    end 
    end 
end 

Однако, кажется, что все, что я пытаюсь я до сих пор не в состоянии оказать форму. Я прошу прощения, если это очень простой вопрос, и меня больше всего интересует улучшение принципов Ruby on Rails, поэтому любые советы приветствуются! Благодаря!

+0

какие ошибки вы получаете? – Debadatt

+1

Возможно, вам нужно инициализировать @message = Message.new в контроллере static_pages в действии, которое вы показываете вкладкам. – Debadatt

ответ

1

Если вы хотите визуализировать эту форму в других шаблонах (и вы делаете), вы должны извлечь ее на частичное имя, например: _form.html.erb.

Затем вы должны поставить

<%= render 'contact/form' %> 

везде вам нужно это частичное ввиду (включая new.html.erb шаблон). Когда вы закончите с этим, вы должны оставить

render :new 

в контроллере, так как он работает немного по-другому, чем в поле зрения и это делает соответствующий шаблон действий, а не частично. Конечно, вам нужно установить переменную @message везде, где это необходимо. Или, вы можете поместить в вашем частичном:

<%= form_for(@message || Message.new) do |f| %> 

Более подробная информация о макетах и ​​рендеринг here.

+0

Выполнение приведенных выше решений дает мне неопределенный метод 'model_name 'для NilClass: Class – user1337902

+1

@ user1337902, как я писал, вам нужно установить' @ message' в каждом действии, которое вы хотите отобразить частично. Или вместо этого вы можете написать в своих частицах: 'form_for (@message || Message.new) ...'. –

+0

отлично! добавив <% @ message = Message.new%> в дополнение к вашим советам, это заставило его работать. Благодаря!!! – user1337902