2013-05-28 87 views
0

我試圖在現有視圖(模型的「顯示」視圖)上實現聯繫我們表單。rails聯繫表單問題

我得到一個未定義的方法`model_name'爲NilClass:類,我不知道我是否正確實施的東西。

在我show.html.erb

<%= form_for @message do |f| %> 
    <%= f.error_messages %> 
    <p> 
    <%= f.label :name %><br /> 
    <%= f.text_field :name %> 
    </p> 
    <p> 
    <%= f.label :email %><br /> 
    <%= f.text_field :email %> 
    </p> 
    <p> 
    <%= f.label :content, "Message" %><br /> 
    <%= f.text_area :content %> 
    </p> 
    <p><%= f.submit "Send Message" %></p> 
<% end %> 

在具有所有的網站(索引,更新,顯示)的行動我的主控制器,我添加了以下措施

# GET /listings/1 
    # GET /listings/1.json 
    def show 
    @listing = Listing.find(params[:id]) 

    respond_to do |format| 
     format.html # show.html.erb 
     format.json { render json: @listing } 
    end 
    end 


    def newmessage 
    @message = Message.new 
    end 


    def sendmessage 
    @message = Message.new(params[:message]) 
    if @message.valid? 
    # MessageMailer.new_message(@message).deliver 
     flash[:notice] = "Message envoy avec succes" 
     redirect_to root_path 
    else 
     render :newmessage 
    end 
    end 

而我Message.rb類看起來是這樣的:

class Message 
    extend ActiveModel::Naming 
    include ActiveModel::Conversion 
    include ActiveModel::Validations 
    include ActionView::Helpers::TextHelper 

    attr_accessor :name, :email, :message 

    validates :name, 
      :presence => true 

    validates :email, 
      :format => { :with => /\b[A-Z0-9._%a-z\-][email protected](?:[A-Z0-9a-z\-]+\.)+[A-Za-z]{2,4}\z/ } 

    validates :message, 
      :length => { :minimum => 10, :maximum => 1000 } 


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


    def persisted? 
    false 
    end 

end 
+0

是什麼地方的形式呈現控制器和動作的名字嗎?您可以在渲染表單@message = Message.new的操作中加載消息變量,可能您會在消息控制器的show action中執行此操作。 – rmagnum2002

回答

2
def your_action_where_you_render_form 
    @message = Message.new 
end 

def create 
    @message = Message.new(params[:message]) 
    if @message.save 
    do this 
    else 
    do that 
    end 
end 

當您使用<%= form_for @message do |f| %>構建表單時,這意味着您需要在表單渲染的操作中初始化該變量,就像您在名爲newmessage的操作中所做的那樣,但是如果要使用該操作,則必須將url添加到形式somethink喜歡這裏Rails 3 Form For Custom Action

def show 
    @listing = Listing.find(params[:id]) 
    @message = Message.new 

    respond_to do |format| 
     format.html # show.html.erb 
     format.json { render json: @listing } 
    end 
    end 
+0

我在我的動作中初始化了變量。事實上,我有類似的代碼,除了我的操作被稱爲newmessage和sendmessage。我還添加了:url => {:action =>「sendmessage」}但是我得到的錯誤未定義的方法'model_name'爲NilClass:類 – Ayrad

+0

似乎像url需要:url => sendmessage_path,<%= form_for @message, :url => sendmessage_path do | f | %>,當你在控制檯 – rmagnum2002

+0

中運行耙路由時,這個url也取決於你的sendmessage動作的路由是什麼樣子,你說你已經初始化了你的變量,但是我懷疑它,因爲你正在渲染在show.html.erb中的表單可能意味着你在那個時候調用show動作,這意味着你應該在show動作中有@message = Message.new,你沒有在這裏發佈show動作,所以我不能說當然,如果你有它需要的地方,你就會更清楚。 – rmagnum2002