2013-02-18 67 views
1

我有兩個控制器頁面和聯繫人。頁面顯示來自數據庫的東西。聯繫人是簡單的聯繫表格,效果很好。現在我想把這個聯繫表單放在特定的頁面中。但我儘量使這一點,仍然有不一樣的模型類錯誤等Rails在其他控制器中呈現聯繫表格

這是我的聯繫控制器(控制器/ contact_controller):

class ContactController < ApplicationController 

    def new 
     @message = Message.new 
    end 

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

     if @message.valid? 
     NotificationMailer.new_message(@message).deliver 
     redirect_to(root_path, :notice => "Sent.") 
     else 
     flash.now.alert = "Alert." 
     render :new 
     end 
    end 

end 

這是我的消息模型(模型/ message.rb) :

class Message 

    include ActiveModel::Validations 
    include ActiveModel::Conversion 
    extend ActiveModel::Naming 

    attr_accessor :name, :email, :subject, :body 

    validates :name, :email, :subject, :body, :presence => true 
    validates :email, :format => { :with => %r{[email protected]+\..+} }, :allow_blank => true 

    def initialize(attributes = {}) 
    attributes.each do |name, value| 
     send("#{name}=", value) 
    end 
    end 

    def persisted? 
    false 
    end 

end 

,這是形式(視圖/接觸/ new.html.erb):

<%= form_for @message, :url => contact_path do |form| %> 
    <fieldset class="fields"> 
    <div class="field"> 
     <%= form.label :name %> 
     <%= form.text_field :name %> 
    </div> 

    <div class="field"> 
     <%= form.label :email %> 
     <%= form.text_field :email %> 
    </div> 
    <div class="field"> 
     <%= form.label :subject %> 
     <%= form.text_field :subject %> 
    </div> 

    <div class="field"> 
     <%= form.label :body %> 
     <%= form.text_area :body %> 
    </div> 
    </fieldset> 

    <fieldset class="actions"> 
    <%= form.submit "Send" %> 
    </fieldset> 
<% end %> 

如何把這個表單放到頁面視圖中?

回答

0

我認爲你應該使用partials。例如,您可以將其放在名爲「app/views/shared/_message_form.html.erb」的文件中,然後在聯繫人/新(和所有其他頁面)中輸入: render 'shared/message_form'

顯然,您必須在每個控制器中設置@message,其中視圖呈現此部分。也許你可以在你的ApplicationController中有一個方法,如set_message,並在需要時調用它。
簡單的例子:

class ApplicationController < ActionController::Base 
    protect_from_forgery 

    def set_message 
    @message = Message.new params[:message] || {} 
    end 
end 

然後你就可以使用set_message任何控制器:)

+0

但做什麼用的:URL => contact_path? Shoudl我離開了嗎? – 2013-02-18 20:52:50

+0

以及如何做到這一點set_message :) – 2013-02-18 21:03:38

+0

對於url,我認爲你希望請求總是去聯繫人控制器,所以是的,你可以離開contact_path。 對於set_message,我已經更新了答案。 – Iazel 2013-02-18 21:20:14

相關問題