联系表单不起作用,它不保存到DB

时间:2015-09-29 07:52:57

标签: ruby-on-rails ruby

我是铁路菜鸟。我不知道问题出在哪里。 我无法通过帮助联系表单将消息保存到数据库。但我可以通过帮助来保存它" ContactForm.new"在rails console中。

我的contact_form_controller.rb是:

class ContactFormController < ApplicationController
  def new
  end

  def create
    @contact_form = ContactForm.create!(params[:contact_form])
    @contact_form.save!
    redirect_to root_path
  end

  def show
    @contact_form = ContactForm.all
  end
end

我的contact_form.html.erb是:

<div class="all-banners-width">
    <figure class="green-background">
        <%= form_for :contact_form do |f| %>
            <p>
                <%= f.label :name %><br>
                <%= f.text_field :name %>
            </p>

            <p>
                <%= f.label :phone %><br>
                <%= f.text_field :phone %>
            </p>

            <p>
                <%= f.label :email %><br>
                <%= f.text_field :email %>
            </p>

            <p>
                <%= f.label :text %><br>
                <%= f.text_field :text %>
            </p>

            <p>
                <%= f.submit %>
            </p>
        <% end %>
    </figure>
</div>

我的数据库迁移文件是:

class CreateContactForms < ActiveRecord::Migration
  def change
    create_table :contact_forms do |t|
      t.string :name
      t.string :phone
      t.string :email
      t.string :text

      t.timestamps null: false
    end
  end
end

我的routes.rb是:

Rails.application.routes.draw do
  resources :users
  resources :sessions, only: [:new, :create, :destroy]
  resources :contact_forms, only: [:new, :create, :destroy]
  root 'static_pages#home'
  match '/',        to: 'static_pages#home',       via: 'post'
  match '/manager', to: 'static_pages#manager',    via: 'get'
  match '/manager', to: 'sessions#create',         via: 'post'
  match '/signin',  to: 'sessions#new',            via: 'get'
  match '/signout', to: 'sessions#destroy',        via: 'delete'

当我通过此表单发送消息时,没有任何错误。 感谢

2 个答案:

答案 0 :(得分:3)

如您所说,您使用的是 Rails 4.2.4 ,您应该在控制器中使用 强参数

您的create方法如下所示

def create
  @contact_form = ContactForm.new(contact_form_params)
  if @contact_form.save
     redirect_to root_path, notice: "Successfully Created"
  else
     render :new
  end
end

并定义contact_form_params方法,如下所示

private
def contact_form_params
  params.require(:contact_form).permit(:name, :phone, :email, :text)
end

还值得将new方法更改为

def new
  @contact_form = ContactForm.new
end

并在form

中使用它
<%= form_for @contact_form do |f| %>

答案 1 :(得分:1)

  

我是铁杆诺布。

以下是我使用的内容:

#config/routes.rb
resources :messages

#app/models/message.rb
class Message < ActiveRecord::Base
end

#app/controllers/messages_controller.rb
class MessagesController < ApplicationController
    def new
       @message = Message.new
    end
    def create
       @message = Message.new message_params
       @message.save
    end

    private

    def message_params
       params.require(:message).permit(:name, :phone, :email, :text)
    end
end

#app/views/messages/new.html.erb
<%= form_for @message do |f| %>
   <%= f.text_field :name %>
   <%= f.text_field :phone %>
   <%= f.text_field :email %>
   <%= f.text_field :text %>
   <%= f.submit %>
<% end %>

class CreateMessages < ActiveRecord::Migration
  def change
    create_table :messages do |t|
      t.string :name
      t.string :phone
      t.string :email
      t.string :text

      t.timestamps null: false
    end
  end
end

备注

  1. 讯息
  2. 为什么我会将其称为消息

    考虑一下你在数据库中保存的内容。这不是表格,而是信息。也许我们可以称之为其他东西,但我不会称之为contact_form

    1. create!
    2. 首先,除非您想以当前形式操纵该特定对象,否则请勿使用bang operator (!)

      虽然this particular scenario不是这种情况,但通常情况下,如果您想在不重新声明变量的情况下操纵变量,则需要调用方法的“bang”变体:

      调用create!基本上违背了您希望在Rails中找到的每个约定。你应该坚持使用@object.save