我有Java背景。我曾经将POJO(Plain Old Java Object)类绑定到表单。 POJO与任何数据库表都没有关联。 我试图在Rails中做同样的事情。我创建了以下模型:
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
然后我收到错误:
未定义的方法`type_cast_from_database'表示“string”:String
答案 0 :(得分:0)
我用这个更新了我的模型类并且它工作了
class Email
include ActiveModel::Model
attr_accessor :name
attr_accessor :to_email
attr_accessor :subject
attr_accessor :message
end
我为此创建了一个帖子
http://ashutoshpandey.in/creating-table-less-models-in-rails-4/
答案 1 :(得分:-1)
您的第一个错误可能是form_for(@email ....)
(为什么我需要猜测这个,因为这应该只是在错误信息的堆栈跟踪中?)
form_for
想知道这个@email
- 对象是什么,它通过调用model_name
来询问它,而你的普通ruby对象没有响应。之后,您的对象也不会响应create
方法。而且您的对象也没有实现验证。
有两种解决方案:
如果您想坚持使用基本对象,请不要使用form_for
,请使用form_tag
。
你需要逐个处理参数。
在方法中包含ActiveModel模块。这样,您的对象就像没有数据库内容的ActiveRecord。来自文档:
包含对象与之交互所需的界面 ActionPack,使用不同的ActiveModel模块。它包括模型 命名内省,转换,翻译和验证。 除此之外,它允许您使用哈希值初始化对象 属性,非常像ActiveRecord。
请参阅http://guides.rubyonrails.org/active_model_basics.html
最后的错误是因为railscast已过期。 提示:如果你看到较旧的railscast,请查看评论。