【问题标题】:Rails 4 form not saving data to databaseRails 4表单未将数据保存到数据库
【发布时间】:2014-08-07 03:59:11
【问题描述】:

我正在使用 Rails 4,并尝试通过表单保存数据,但该过程不断失败。我已尽我所能查看其他有类似问题的人,但即使复制他们的代码对我也不起作用。填写表格后的最终结果是收到错误消息,指出未保存联系人。有任何想法吗?谢谢!

控制器/contacts_controller.rb

class ContactsController < ApplicationController

  def create
    @contact = Contact.new(contact_params)
    if @contact.save
      flash[:success] = "Contact saved!"
    else
      flash[:alert] = "Contact not saved!"
    end
  end

  def destroy
  end

  def new
    @contact = Contact.new
  end

  private

    def contact_params
      params.require(:contact).permit(:first_name, :last_name, :email)
    end
end

views/contacts/new.html.erb

<div class= "panel-body">
  <%= form_for(@contact) do |f| %>

  <div class="form-group">
    <%= f.label :first_name %>
    <%= f.text_field :first_name, autofocus: true, class: "form-control" %>
  </div>

  <div class="form-group">
    <%= f.label :last_name %>
    <%= f.text_field :last_name, autofocus: true, class: "form-control" %>
  </div>        

  <div class="form-group">
    <%= f.label :email %>
    <%= f.email_field :email, autofocus: true, class: "form-control" %>
  </div>

  <div class="form-group">
    <%= f.submit "Add", class: "btn btn-primary" %>
  </div>

  <% end %>
</div>

config/routes.rb

Rails.application.routes.draw do

  resources :contacts, only: [:new, :create, :destroy]

end

models/contact.rb

class Contact < ActiveRecord::Base

    validates :first_name, presence: true
    validates :last_name, presence: true
    validates :email, presence: true    

end

db/迁移

class CreateContacts < ActiveRecord::Migration
  def change
    create_table :contacts do |t|
      t.string :first_name
      t.string :last_name
      t.string :email

      t.timestamps
    end
  end
end

【问题讨论】:

  • 我们能否看到错误消息和您对联系人表的迁移。
  • 由于您收到警报消息,我认为会有一些验证失败。你能发布你的联系模型吗?
  • 没有错误信息...联系人根本不保存,并且出现“联系人未保存”的闪存。将模型和迁移添加到描述中。
  • 你能在 def create 中写一个像 P contact_params 这样的代码,并告诉我它从控制台输出吗
  • @NidhinSG:不清楚你想让我做什么。获取我的联系人参数并在创建中定义它们?

标签: ruby-on-rails forms ruby-on-rails-4


【解决方案1】:

既然您收到了警报消息,我想会有一些 验证失败。

我的想法完全正确 - 当您致电 .save 时出现问题可能有多种原因:

  • 验证错误
  • 您的数据库可能不完整(需要运行rake db:migrate
  • 您的数据结构可能存在问题

我会这样做:

  1. 从您的 Contact 模型中删除所有验证
  2. 确保执行rake db:migrate(以迁移您的数据表)
  3. 确保在将 params 哈希从 view 传递到 controller 时填充它

--

错误

当您提到没有错误时,除非您将它们实际显示在您的网站上,否则不会有:

引用this answer,你不妨这样做:

<%= form_for @contact do |f| %>
    <% if @location.errors.any? %>
    <ul>
      <% @location.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
    </ul>
    <% end %>
<% end %>

【讨论】:

  • 我尝试了以下各项但均未成功:1. 从联系人模型中删除了验证 2. Ran rake db:migrate 我不确定您所说的 #3 是什么意思(“确保填充了您的参数哈希当你将它从你的视图传递给你的控制器时”)。我该如何检查?我还实现了显示您建议的错误,但我的网站上仍然没有显示错误。只是一条消息:d.pr/i/GNVO
【解决方案2】:

您好,我刚遇到这个问题。

阅读此线程中提供的链接,并查看其他一些有关布局和部分文件的屏幕截图。

结论:

  • 部分渲染表单不是原因 您只需要确保在控制器类中实例化了实例变量(在“新”操作中)
  • 对我来说,我正在包装 form_for 在“”标签内因此导致提交按钮出现混乱提交按钮会将表单提交到表单的“action”属性中指定的url)并且由于这种包装我的表单没有'没有动作属性。

所以当我点击提交按钮时,它只是重新加载/刷新页面。

对于其他遇到的事情,您必须检查生成的表单标签。

P.S:信息链接对于像我这样的 Rails 新手来说是必读的, 结果我们还可以将变量发送到部分,而不仅限于 :provide & yield 方法。

【讨论】:

    猜你喜欢
    • 2016-01-15
    • 2014-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-07
    • 1970-01-01
    • 2019-08-21
    相关资源
    最近更新 更多