2015-10-04 82 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,请查看评论。