2015-10-04 64 views
0

我有一個Java背景。我曾經將POJO(普通Java對象)類綁定到表單。 POJO的不與任何數據庫表關聯。 我試圖在Rails中做同樣的事情。我創建了以下型號:綁定導軌4與表格無模

class Email 

def initialize 
    @to_email = '' 
    @name = '' 
    @subject = '' 
    @message = '' 
end 

end 

與以下形式:

<h1>Please fill up the form</h1> 
<%= form_for @email, :url => {:action => 'sendemail'} do |f| %> 
<p> 
    Name<br/><%= f.text_field 'name' %> 
</p> 
<p> 
    Email<br/><%= f.text_field 'to_email' %> 
</p> 
<p> 
    Subject<br/><%= f.text_field 'subject' %> 
</p> 
<p> 
    Message<br/><%= f.text_area 'message' %> 
</p> 
<p> 
    <%= f.submit "Submit Data" %> 
</p> 
<% end %> 

這裏是我的控制器:

class EmailController < ApplicationController 

def capture 
    @email = Email.new 
end 

def sendemail 
    @email = Email.create(email_params) 

    MandrillMailer.send_email(@email.to_email, @email.name, @email.subject, @email.message).deliver 
end 

def email_params 
    params.require(:email).permit(:name, :email, :subject, :email) 
end 

end 

我得到的錯誤是:未定義的方法`MODEL_NAME」的#

我也試過這個網址,但不能通過

http://railscasts.com/episodes/193-tableless-model

得到在這種情況下我的模式是:

class Email 

def self.columns() 
    @columns ||= [];  # || represents concatenation 
end 

def self.column(name, sql_type=nil, default=nil, null=true) 
    columns << ActiveRecord::ConnectionAdapters::Column.new(name.to_s, default, sql_type.to_s, null) 
end 

column :to_email, :string 
column :name, :string 
column :subject, :string 
column :message, :text 

end 

在這種情況下,錯誤是:

undefined method `model_name' for #<Email:0x49f5b40> 

這表明在視圖<%= form_for @email, :url => {:action => 'sendemail'} do |f| %>

如果我將模型類編寫爲:

class Email < ActiveRecord::Base 

然後我得到的錯誤:

undefined method `type_cast_from_database' for "string":String

+0

和後?問題是什麼? – Meier

+0

嗨邁爾,我更新了問題,指出我得到的所有錯誤,謝謝 – Ashutosh

+0

你可以顯示錯誤消息的整個回溯。我還需要行號以指出最新情況。 – uday

回答

0

你的第一個錯誤可能是由form_for(@email ....)

(拋出爲什麼我需要猜測這一點,因爲這應該是剛剛在堆棧跟蹤

form_for要找出這個@email -object是什麼錯誤消息?),它要求它通過調用model_name,一你的普通紅寶石物體沒有反應。稍後,您的對象也不會響應create方法。而且你的對象也沒有實現驗證。

解決辦法有兩個:

  1. 如果你想堅持的基本對象,不使用form_for,使用form_tag。 你需要逐個處理參數。

  2. 在您的方法中包含ActiveModel模塊。這樣,你的對象的行爲就像一個沒有數據庫的東西的ActiveRecord。從文檔:

Includes the required interface for an object to interact with ActionPack, using different ActiveModel modules. It includes model name introspections, conversions, translations and validations. Besides that, it allows you to initialize the object with a hash of attributes, pretty much like ActiveRecord does.

http://guides.rubyonrails.org/active_model_basics.html

末的錯誤是因爲railscast是過時的。提示:如果您看到較舊的railscast,請查看評論。