Rails4:从不同的控制器保存模型(使用表单和POST)



我是Ruby on Rails的新手,这是我在SO上的第一个问题,我希望有人能帮助我。

我有一个控制器Main和一个视图home,在这个视图中,我有一张用模型创建新条目的表格Mail。我的问题是,我的DB中的条目是空的(我用rails c,Mail.all进行了检查),所有字段都设置为零(除了像id这样的常用字段)。我可能可以通过使用一个同名的模型和控制器来简化我的生活,但我很确定RoR应该能够处理这个问题。

型号邮件

class Mail < ActiveRecord::Base
end

对应的模式.rb

ActiveRecord::Schema.define(version: 20140217160636) do
create_table "mails", force: true do |t|
t.string   "address"
t.string   "type"
t.boolean  "confirmed"
t.datetime "created_at"
t.datetime "updated_at"
end
end

控制器Main:

class MainController < ApplicationController
def home
@mail = Mail.new
end
def create
@mail = Mail.new(params[:main])
if @mail.save
redirect_to :root
end
end
end

从视图主页中显示的_Form.html.erb到<%=的窗体在application.html.erb:中呈现'main/form'%>

<%= form_for @mail do |f| %>
<%= f.text_field :address %>
<%= f.select :type, [['Early adopter','early_adopter'],['Investisseur','investisor'],['Journaliste','journalist']] %>
<%= f.hidden_field :confirmed, :value => false %>
<%= f.submit("S'inscrire") %>
<% end %>
<%= debug(params) if Rails.env.development? %>

调试行始终显示:

--- !ruby/hash:ActionController::Parameters
controller: main
action: home

这对我没有多大帮助。

最后路由.rb

LandingPage::Application.routes.draw do
root 'main#home'
resources :mails, controller: :main, :path => "/"
end

总之:一切都像一个魅力:表单是可见的和功能性的,post方法根据需要重新路由到根,在DB中创建一个邮件条目。我唯一的问题是帖子信息在路由中似乎丢失了,DB条目是空的。

如果有帮助,这里是我的安装信息。

Gemfile

source 'https://rubygems.org'
gem 'rails', '4.0.2'
gem 'sqlite3'
gem 'sass-rails', '~> 4.0.0'
gem 'uglifier', '>= 1.3.0'
gem 'coffee-rails', '~> 4.0.0'
gem 'jquery-rails'
gem 'turbolinks'
gem 'jbuilder', '~> 1.2'
group :doc do
gem 'sdoc', require: false
end
gem 'i18n', '~> 0.6.9'

由于我是RoR的新手,我希望有人能注意到我缺少的东西并解释一下,这样我就可以继续我的RoR教育了。很抱歉,如果你和Main/Mail混淆了,我以后会更好地区分我的名字。

编辑:我将mail的每个实例都更改为mail_info,将邮件更改为mail_infos并成功地执行了数据库迁移。我也有同样的问题,我的mail_infos条目为空(无字段)。所以这与名字无关。

不要为列使用"type"名称,因为它用于单表继承。

你尝试过强参数吗?Rails不允许将Model的所有值保存在DB中。它将允许存在安全漏洞。因此,您应该使用在RoR4之前被称为attr_accessiblestrong parameters

def create
@mail = Mail.new(mail_params)
if @mail.save
redirect_to :root
end
end
private
def mail_params
params.require(:mail).permit(:address, :type, :confirmed)
end