【问题标题】:Rails4: Saving a model from a different controller (with a form and POST)Rails4:从不同的控制器保存模型(使用表单和 POST)
【发布时间】:2014-02-18 10:23:41
【问题描述】:

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

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

型号邮件

class Mail < ActiveRecord::Base
end

对应的schema.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

控制器

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 中的 显示在视图主页中:

<%= 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

这对我没有多大帮助。

最后routes.rb

LandingPage::Application.routes.draw do

  root 'main#home'
  resources :mails, controller: :main, :path => "/"

end

总结一下:几乎所有东西都像魅力一样工作:表单可见且功能齐全,post 方法根据需要重新路由到根目录,在数据库中创建一个邮件条目。我唯一的问题是帖子信息似乎在路由中丢失了,并且数据库条目是空的。

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

宝石文件

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 感到困惑,我会在以后尝试更好地区分我的名字。

编辑: 我将 ma​​il 的每个实例更改为 ma​​il_info,将 ma​​ils 更改为 ma​​il_infos 并成功执行了 db:migrate 。我有同样的问题,我的 ma​​il_infos 条目是空的(无字段)。所以这与名字无关。

【问题讨论】:

  • 我不认为你可以创建一个名为 Mail 的类,这已经是一个内置 rails 模块的名称。要对此进行测试,请转到控制台并输入“Mail.new”,查看创建的对象类型
  • @Slicedpan 在这种情况下,OP 应该有错误吧?
  • 是的,可能包含邮件类定义的文件没有被加载。我无法使用 rails 4 在控制台中创建一个名为 Mail 的类,我得到“邮件不是一个类”,因为它已经被定义为一个模块
  • 其实我只是尝试用上面的类定义创建一个名为 mail.rb 的文件,rails 根本不会启动

标签: ruby-on-rails forms post model controller


【解决方案1】:

不要为列使用“类型”名称,因为它用于单表继承。

【讨论】:

  • 这是最终解决我的问题的答案,尽管其他更改也可能是必要的。谢谢。
【解决方案2】:

你试过strong parameters吗? Rails 不允许将 Model 的所有值保存在数据库中。它将允许安全漏洞。因此,您应该使用在 RoR 4 之前称为 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

【讨论】:

  • 我得到:无效的单表继承类型:early_adopter 不是 Mail 的子类
  • 尝试将名称 Mail 更改为非保留字。正如@Slicedpan 评论的那样,您不应该使用Mail,它是Rails 中的module
  • 我尝试将 Mail 更改为 Mail_info,但它并没有解决我的初始代码问题。如果我使用建议的代码(即使 Mail -> Mail_info 更改),我也会收到相同的“无效的单表继承类型”错误。
  • 尝试将列名type 更改为其他名称。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-30
  • 1970-01-01
相关资源
最近更新 更多