首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嵌套属性表单验证Bugs

嵌套属性表单验证Bugs
EN

Stack Overflow用户
提问于 2016-10-11 23:05:30
回答 2查看 37关注 0票数 0

我看到一个带有嵌套属性表单的奇怪错误。我有两个模特,一个是Parties,另一个是来宾。派对has_many客人和客人belongs_to派对。我有一份通过派对创造客人的表格。

我看到的bug如下:

  • 当我第一次访问表单页面时,所有内容都会加载,但我无法提交数据。如果我在页面呈现时立即刷新它,那么当我按submit时,我输入的任何内容都会击中数据库。我发现submit按钮在单击它时会更改为它的活动状态,但是当它不工作时,它永远不会离开它。

为什么在表单提交数据之前我必须刷新页面?我很感激能帮我解开这个问题。我甚至不知道该开始拉哪根线。

party.rb

代码语言:javascript
复制
class Party < ApplicationRecord

  belongs_to :event
  has_many :guests, inverse_of: :party
  accepts_nested_attributes_for :guests, :reject_if => proc { |attribute| attribute[:last_name].blank? }
  validate :validate_nested_attributes

  def validate_nested_attributes
    guests.each do |guest|
      errors.add(:first_name, "first name cannot be blank") if guest.first_name.blank?
      errors.add(:email, "must be valid") if !email_is_valid(guest.email)
    end
  end

  def email_is_valid(email)
    email =~ /\A([\w+\-].?)+@[a-z\d\-]+(\.[a-z]+)*\.[a-z]+\z/i
  end

end

guest.rb

代码语言:javascript
复制
class Guest < ApplicationRecord

  belongs_to :party
  belongs_to :event


end

parties_controller.rb

代码语言:javascript
复制
class PartiesController < ApplicationController

  def index
  end  

  def new
    @event = Event.friendly.find(params[:event_id])
    @party = @event.parties.new
    10.times {@party.guests.build}
  end

  def create
    @event = Event.friendly.find(params[:event_id])
    @party = @event.parties.new(party_params)
    if @party.save
      redirect_to event_guests_path(@event)
    else
      render 'new'
    end
  end


  private

    def party_params
      params.require(:party).permit(:id, :party_name, guests_attributes: [:event_id, :id, :first_name, :last_name, :email, :phone])
    end
end

new.html.erb

代码语言:javascript
复制
<div class="col-sm-10 col-sm-offset-1"><h2>Create a New Invitation Party</h2></div>

  <div class="form-group col-sm-10 col-sm-offset-1 well" id="guests">
    <ul>
      <% if @party.errors.any? %>
          <% @party.errors.each do |attribute, msg| %>
            <li><%= "#{attribute} #{msg}" if @party.errors[attribute].first == msg %>
          <% end %>
        <% end %>
      <%= form_for [@event, @party] do |f| %>
    </ul>

      <%= render :partial => 'guest_fields', :locals => { :f => f } %>
  </div>

  <div class="col-sm-8 col-sm-offset-2 pull-right">
    <%= f.submit "Create Party", class: "btn btn-primary pull-right", style: "margin-right: 10%;" %>
    <%= link_to "Back", event_guests_path(@event), class: "btn btn-danger pull-right", style: "margin-right: 5px;" %> 
  </div>


<% end %>

_guest_fields.html.erb

代码语言:javascript
复制
<%= f.fields_for :guests do |ff| %>

  <%= ff.hidden_field :event_id, :value => @event.id %>

  <div class="row">
    <div class="form-group col-sm-3">
      <%= ff.text_field :first_name, placeholder: "First Name", class: "form-control" %>
    </div>

    <div class="form-group col-sm-3">
      <%= ff.text_field :last_name, placeholder: "Last Name", class: "form-control" %>
    </div>

    <div class="form-group col-sm-3">
      <%= ff.text_field :email, placeholder: "Email Address", class: "form-control" %>
    </div>

    <div class="form-group col-sm-3">
      <%= ff.text_field :phone, placeholder: "Phone Number", class: "form-control" %>
    </div>
    <hr>
  </div>
<% end %>

GET请求的Rails服务器日志

代码语言:javascript
复制
Started GET "/events/2993Alexandro/parties/new" for -.-.-.- at 2016-10-11 23:00:56 +0000
Cannot render console from -.-.-.-! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255
Processing by PartiesController#new as HTML
  Parameters: {"event_id"=>"2993Alexandro"}
  Event Load (0.5ms)  SELECT  "events".* FROM "events" WHERE "events"."path" = $1 ORDER BY "events"."id" ASC LIMIT $2  [["path", "2993Alexandro"], ["LIMIT", 1]]
  Rendering parties/new.html.erb within layouts/application
  Rendered parties/_guest_fields.html.erb (9.7ms)
  Rendered parties/new.html.erb within layouts/application (15.9ms)
  User Load (0.3ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 6], ["LIMIT", 1]]
  Rendered layouts/_left_bar.html.erb (1.4ms)
Completed 200 OK in 180ms (Views: 98.5ms | ActiveRecord: 0.8ms)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-12 00:00:52

代码语言:javascript
复制
  <%= form_for [@event, @party] do |f| %> 
</ul> 

为什么你的开放式标签一半在ul里面?匹配的结尾在哪里?表单是块级组件--它应该完全包含在外部块中--而不是一半在一个标记中,另一半在另一个标记中。

我不知道这是否会解决您的问题,但它肯定会修复您的html。尝试更像这样的东西:

代码语言:javascript
复制
<div class="col-sm-10 col-sm-offset-1"><h2>Create a New Invitation Party</h2></div>

<div class="form-group col-sm-10 col-sm-offset-1 well" id="guests">
  <ul>
    <% if @party.errors.any? %>
        <% @party.errors.each do |attribute, msg| %>
          <li><%= "#{attribute} #{msg}" if @party.errors[attribute].first == msg %>
        <% end %>
    <% end %>
  </ul>

  <%= form_for [@event, @party] do |f| %>

    <%= render :partial => 'guest_fields', :locals => { :f => f } %>


    <div class="col-sm-8 col-sm-offset-2 pull-right">
      <%= f.submit "Create Party", class: "btn btn-primary pull-right", style: "margin-right: 10%;" %>
      <%= link_to "Back", event_guests_path(@event), class: "btn btn-danger pull-right", style: "margin-right: 5px;" %> 
    </div>

  <% end %>
</div>
票数 0
EN

Stack Overflow用户

发布于 2016-10-12 00:36:17

试试这个,我希望我能帮上忙

代码语言:javascript
复制
def new
@event = Event.friendly.find(params[:event_id])
@party = @event.parties.new(party_params)
10.times {@party.guests.build}
end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39988110

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档