2

Rails 3.2 を使用しており、ネストされたフォームを作成しています。しかし、物事は私が期待するように機能していません。まず第一に、私のモデルは多くの住所を持つ会社です。モデルはこちら

class Company
    include Mongoid::Document
    include Mongoid::Timestamps

    field :name,                        :type => String
    field :description,         :type => String
    field :order_minimun,       :type => Float

    belongs_to :user

    has_many :addresses

    validates_presence_of :name, :description, :order_minimun
  validates_length_of :name, minimum:2, maximum: 30
  validates_length_of :description, minimum:5, maximum: 140
    validates :order_minimun, :numericality => { :only_integer => true, :greater_than_or_equal_to => 0 }

    accepts_nested_attributes_for :addresses
    validates_associated :addresses

end

class Address
    include Mongoid::Document
    include Mongoid::Timestamps
    include Mongoid::Spacial::Document


    field :street,      :type => String
    field :number,      :type => Integer

    field :phone,           :type => String

    field :location,        :type => Array,     spacial: {lat: :latitude, lng: :longitude, return_array: true }

    embeds_many :delivery_zones


    belongs_to :company
    belongs_to :city

    has_many :openingTimeRange

    validates_presence_of :street, :number
  validates_length_of :street, minimum:1, maximum: 30
    validates_length_of :number, minimum:1, maximum: 6
    validates_length_of :phone, minimum:5, maximum: 60


    attr_accessible :street, :number, :company_id, :city_id, :location, :phone, :delivery_zones, :latitude, :longitude

end

ご覧のとおり、Company モデルには次のものがあります。

accepts_nested_attributes_for :addresses
validates_associated :addresses

だから、ネストされたフォームを構築できると思います。フォームのコードはこちら

<%= form_for [:admin,@company],:url =>admin_company_path(@company), :html => {:class => "form-horizontal"}  do |f|%>

    <legend><%= t '.legend' %></legend>

    <%= group_input_field f, :name%>

    <%= group_field_for f, :description do%>
        <%= f.text_area :description, :rows => 5%>
    <% end -%>

    <%= group_input_field f, :order_minimun%>

    <%= f.fields_for :addresses do |builder|%>
        <%= render 'address_fields', :f=> builder%>
    <% end %>

    <div class="form-actions">
        <%= f.submit :class => 'btn btn-primary btn-large', :disable_with => t('button.saving') %>
        <%= link_to t('.cancel', :default => t("helpers.links.cancel")),
                admin_companies_path, :class => 'btn btn-large btn-danger' %>
  </div>

<% end %>

_address_fields.html.erb

<%= group_input_field f, :street%>
<%= group_input_field f, :number%>

ブートストラップでフォーム フィールドを生成する単純なヘルパーがあります。

def group_input_field(f,field, options={})
    has_error = f.object.errors.has_key? field
    klass = has_error ? "control-group error": "control-group"
    content_tag(:div, :class => klass) do
        f.label(field, :class => 'control-label')+
        content_tag(:div, :class => 'controls') do
            f.text_field(field, :class => 'input')+
            show_error(f.object,field,has_error)+
            show_help(options)
            end
        end
end

最後にコントローラー:

class Admin::CompaniesController < ApplicationController

    def new
        #crea una nueva compañia
        @company = Company.new
    end

    def edit
        @company = Company.find params[:id]
    end

    def create
        @company = Company.new(params[:company])
        if @company.save
            redirect_to :action => 'index'
        else
            render 'new'
        end
    end

    def update
        @company = Company.find(params[:id])
        if @company.update_attributes(params[:company])
            redirect_to :action => 'index'
        else
            render 'edit'
        end
    end

end

いくつかのことが起こっています。まず、私は 2 つの住所を持つ会社を持っています。最初の住所は編集できますが、2 番目の住所の変更は保持されません。次に、住所フィールドは検証されません(フォームを再度開いたときにすべてを空白のままにしておくと、住所が保存されず、元の値が表示されます)。また、任意の住所のフィールドを編集し、会社の任意のフィールド値が無効な場合、フォームが送信された後、会社モデルにエラーが表示されますが、住所は元の値で表示されるため、編集された値は失った。

明確であることを願っています。

前もって感謝します。

4

1 に答える 1

2

さて、私は答えを見つけました。私はmongoid 3.0.4のバージョンを使用していました。コマンド bundle update mongoid を実行すると、mongoid がバージョン 3.0.6 に更新されました。そして、問題は修正されました。

ありがとう。それが役に立てば幸い

于 2012-09-16T23:08:48.517 に答える