绑定Rails 4形式与没有表格的模型

时间:2015-10-04 12:11:24

标签: ruby-on-rails model

我有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

2 个答案:

答案 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方法。而且您的对象也没有实现验证。

有两种解决方案:

  1. 如果您想坚持使用基本对象,请不要使用form_for,请使用form_tag。 你需要逐个处理参数。

  2. 在方法中包含ActiveModel模块。这样,您的对象就像没有数据库内容的ActiveRecord。来自文档:

  3.   

    包含对象与之交互所需的界面   ActionPack,使用不同的ActiveModel模块。它包括模型   命名内省,转换,翻译和验证。   除此之外,它允许您使用哈希值初始化对象   属性,非常像ActiveRecord。

    请参阅http://guides.rubyonrails.org/active_model_basics.html

    最后的错误是因为railscast已过期。 提示:如果你看到较旧的railscast,请查看评论。