首页 > 解决方案 > Rails 表单提交空白

问题描述

我正在处理我的 Rails 应用程序表单:

          <div class="col-md-9">
            <div class="card">
              <div class="card-header">
                <strong>Add Contact</strong>
              </div>     

        <% if @contact.errors.any? %>
           <div class="alert alert-danger">
               <h3>Please correct the following:</h3>
                  <ul>
                   <% @contact.errors.full_messages.each do |message| %>
                       <li> <%= message %></li>
                   <% end %>
                  </ul>
           </div>
        <% end %>

     <%= form_for(@contact, html: {multipart: true}) do |f| %>

              <div class="card-body">
                <div class="row">
                  <div class="col-md-9">



                    <div class="form-group row">
                      <%= f.label :name, class: "col-md-3 col-form-label"%>
                      <div class="col-md-8">
                        <%= f.text_field :name, class: "form-control"%>
                      </div>
                    </div>

                    <div class="form-group row">
                      <%= f.label :email, class: "col-md-3 col-form-label"%>
                      <div class="col-md-8">
                        <%= f.email_field :email, class: "form-control"%>
                      </div>
                    </div>

                     <div class="form-group row">
                      <%= f.label :phone, class: "col-md-3 col-form-label"%>
                      <div class="col-md-8">
                        <%= f.text_field :phone, class: "form-control"%>
                      </div>
                    </div>


                     <div class="form-group row">
                      <%= f.label :mobile, class: "col-md-3 col-form-label"%>
                      <div class="col-md-8">
                        <%= f.text_field :mobile, class: "form-control"%>
                      </div>
                    </div>


                     <div class="form-group row">
                      <%= f.label :company, class: "col-md-3 col-form-label"%>
                      <div class="col-md-8">
                        <%= f.text_field :company, class: "form-control"%>
                      </div>
                    </div>


                    <div class="form-group row">
                       <%= f.label :address, class: "col-md-3 col-form-label"%>
                      <div class="col-md-8">
                         <%= f.text_area :address, class: "form-control", rows: 3%>
                      </div>
                    </div>

                    <div class="form-group row">
                      <%= f.label :city, class: "col-md-3 col-form-label"%>
                      <div class="col-md-8">
                        <%= f.text_field :city, class: "form-control"%>
                      </div>
                    </div>

                 <div class="form-group row">
                      <%= f.label :state, class: "col-md-3 col-form-label"%>
                      <div class="col-md-8">
                        <%= f.text_field :state, class: "form-control"%>
                      </div>
                    </div>

                 <div class="form-group row">
                      <%= f.label :country, class: "col-md-3 col-form-label"%>
                      <div class="col-md-8">
                        <%= f.text_field :country, class: "form-control"%>
                      </div>
                    </div>

                 <div class="form-group row">
                      <%= f.label :zip, class: "col-md-3 col-form-label"%>
                      <div class="col-md-8">
                        <%= f.text_field :zip, class: "form-control"%>
                      </div>
                </div>





                    <div class="form-group row">
                     <%= f.label :group_id, class: "col-md-3 col-form-label"%>
                      <div class="col-md-5">
                          <%= f.collection_select :group_id, Group.all, :id, :name, { prompt: "Select Group" }, class: "form-control" %>
                      </div>
                      <div class="col-md-3">
                        <a href="#" id="add-group-btn" class="btn btn-outline-secondary btn-block">Add Group</a>
                      </div>
                    </div>
                    <div class="form-group row" id="add-new-group">
                      <div class="offset-md-3 col-md-8">
                        <div class="input-group mb-3">
                          <input type="text" class="form-control" name="group_id" placeholder="Enter group name" aria-label="Enter group name" aria-describedby="button-addon2">
                          <div class="input-group-append">
                            <button class="btn btn-outline-secondary" type="button" id="button-addon2">
                              <i class="fa fa-check"></i>
                            </button>
                          </div>
                        </div>
                      </div>
                    </div>
                  </div>


                  <div class="col-md-3">
                    <div class="fileinput fileinput-new" data-provides="fileinput">
                      <div class="fileinput-new img-thumbnail" style="width: 150px; height: 150px;">
                        <img src="http://via.placeholder.com/150x150"  alt="...">
                      </div>
                      <div class="fileinput-preview fileinput-exists img-thumbnail" style="max-width: 150px; max-height: 150px;"></div>
                      <div class="mt-2">
                        <span class="btn btn-outline-secondary btn-file"><span class="fileinput-new">Select image</span><span class="fileinput-exists">Change</span><input type="file" name="..."></span>
                        <a href="#" class="btn btn-outline-secondary fileinput-exists" data-dismiss="fileinput">Remove</a>
                      </div>
                    </div>
                  </div>
                </div>

              </div>
              <div class="card-footer">
                <div class="row">
                  <div class="col-md-8">
                    <div class="row">
                      <div class="col-md-offset-3 col-md-6">
                        <button type="submit" class="btn btn-primary">Save</button>
                        <a href="#" class="btn btn-outline-secondary">Cancel</a>
                      </div>
                    </div>
                  </div>
                </div>
              </div>
            </div>
          </div>

<% end %>

这是我的模型:

class Contact < ApplicationRecord
  belongs_to :group

  validates :name, :email, :phone, :mobile, :company, :address, :city, :state, :country, :zip, :group_id, presence: true
  validates :name, length: {  maximum: 50 }
  validates :email, length: { maximum: 50 }
  validates :phone, length: { maximum: 15 }
  validates :mobile, length: {  maximum: 15 }

  def gravatar
    hash = Digest::MD5.hexdigest(email.downcase)
    "https://www.gravatar.com/avatar/#{hash}"
  end 
end

当我选择组并填写所有内容时,我仍然收到 ff 错误:

Please correct the following:
Group must exist
Group can't be blank

我不确定是什么阻止了提交,因为我在单击“保存”时提交并选择了组。我还检查了 f.collection 字段是否正确启动但仍然出现错误。

知道是什么原因造成的吗?

在此处输入图像描述

更新:

这是我的控制器代码:

class ContactsController < ApplicationController
  def index

    if params[:group_id] && !params[:group_id].empty?
      @contacts = Contact.where(group_id: params[:group_id]).order(:created_at, :desc).page params[:page]
    else 
      @contacts = Contact.order(:created_at, :desc).page params[:page]
  end
end 

def new
  @contact = Contact.new
end 

def create
  @contact = Contact.new(contact_params)
  if @contact.save
    flash[:success] = "Contact was successfully created."
    redirect_to contacts_path
  else
    render 'new' 
  end
end 

private

def contact_params
   params.require(:contact).permit(:name, :email, :phone, :mobile, :company, :address, :city, :state, :country, :zip)
end 


end

这是提交后来自终端的日志:

Started POST "/contacts" for ::1 at 2019-12-14 19:26:30 +0800
Processing by ContactsController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"MsG6nNpJfDSiOHjoUP/TUenhzyIlXlftSxY9xY7q8vkrmQJMUK471gr+8wQmQ8STNoE6kTHTQzM1gC1UUKbO5Q==", "contact"=>{"name"=>"Samuel", "email"=>"samuel@gmail.com", "phone"=>"99999", "mobile"=>"99999", "company"=>"KASdasd", "address"=>"2015-B", "city"=>"ANgeles", "state"=>"Pampanga", "country"=>"Philippines", "zip"=>"9000", "group_id"=>"16"}, "group_id"=>""}
Unpermitted parameter: :group_id
   (0.1ms)  begin transaction
  ↳ app/controllers/contacts_controller.rb:17
   (0.5ms)  rollback transaction
  ↳ app/controllers/contacts_controller.rb:17
  Rendering contacts/new.html.erb within layouts/application
  Group Load (0.3ms)  SELECT "groups".* FROM "groups"
  ↳ app/views/contacts/new.html.erb:109
  Rendered contacts/new.html.erb within layouts/application (17.9ms)
  Rendered layouts/_navbar.html.erb (1.1ms)
   (0.2ms)  SELECT COUNT(*) FROM "contacts"
  ↳ app/views/layouts/_sidebar.html.erb:8
  CACHE Group Load (0.0ms)  SELECT "groups".* FROM "groups"
  ↳ app/views/layouts/_sidebar.html.erb:13
   (0.2ms)  SELECT COUNT(*) FROM "contacts" WHERE "contacts"."group_id" = ?  [["group_id", 15]]
  ↳ app/views/layouts/_sidebar.html.erb:18
   (0.2ms)  SELECT COUNT(*) FROM "contacts" WHERE "contacts"."group_id" = ?  [["group_id", 16]]
  ↳ app/views/layouts/_sidebar.html.erb:18
   (0.2ms)  SELECT COUNT(*) FROM "contacts" WHERE "contacts"."group_id" = ?  [["group_id", 17]]
  ↳ app/views/layouts/_sidebar.html.erb:18
  Rendered layouts/_sidebar.html.erb (8.8ms)
Completed 200 OK in 166ms (Views: 147.9ms | ActiveRecord: 1.7ms)

标签: ruby-on-rails

解决方案


Unpermitted parameter: :group_id在服务器日志中是您的线索。由于 group_id 不在您在以下代码中允许的参数列表中,因此它永远不会被分配,因此它认为您没有选择一个组。

改变

def contact_params
   params.require(:contact).permit(:name, :email, :phone, :mobile, :company, :address, :city, :state, :country, :zip)
end

def contact_params
   params.require(:contact).permit(:name, :email, :phone, :mobile, :company, :address, :city, :state, :country, :zip, :group_id)
end

推荐阅读