我是铁路菜鸟。我不知道问题出在哪里。 我无法通过帮助联系表单将消息保存到数据库。但我可以通过帮助来保存它" 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'
当我通过此表单发送消息时,没有任何错误。 感谢
答案 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
备注强>
为什么我会将其称为消息?
考虑一下你在数据库中保存的内容。这不是表格,而是信息。也许我们可以称之为其他东西,但我不会称之为contact_form
。
create!
强> 首先,除非您想以当前形式操纵该特定对象,否则请勿使用bang
operator (!
)。
虽然this particular scenario不是这种情况,但通常情况下,如果您想在不重新声明变量的情况下操纵变量,则需要调用方法的“bang”变体:
调用create!
基本上违背了您希望在Rails中找到的每个约定。你应该坚持使用@object.save