代码之家  ›  专栏  ›  技术社区  ›  Alex Zakruzhetskyi

保存has one关联的新关联seo_设置失败

  •  0
  • Alex Zakruzhetskyi  · 技术社区  · 7 年前

    我有两种型号:

    class Page < ApplicationRecord
      enum page_type: STATIC_PAGE_TYPES, _suffix: true
      has_one :seo_setting
      accepts_nested_attributes_for :seo_setting, update_only: true
    
      validates :title, :subtitle, length: { maximum: 50 }
      validates :page_type, uniqueness: true
    
      def to_param
        "#{id}-#{page_type}".parameterize
      end
    end
    

    class SeoSetting < ApplicationRecord
      mount_uploader :og_image, SeoSettingsOgImageUploader
      belongs_to :page
    
      validates :seo_title, :seo_description, :og_title, :og_description, :og_image, presence: true
    end
    

    我的 Page 对象是从 seeds.rb 文件,当我想要编辑它们时,我会得到一个错误: Failed to save the new associated seo_setting. 在表格中,我有:

    <div class="card-body">
          <%= form_for([:admin, @page]) do |f| %>
            <%= render 'shared/admin/error-messages', object: @page %>
            <div class="form-group">
              <%= f.label :title, t('admin.shared.title') %>
              <%= f.text_field :title, class: 'form-control' %>
            </div>
            <div class="form-group">
              <%= f.label :subtitle, t('admin.shared.subtitle') %>
              <%= f.text_field :subtitle, class: 'form-control' %>
            </div>
            <h3>SEO Settings</h3>
            <%= f.fields_for :seo_setting, f.object.seo_setting ||= f.object.build_seo_setting do |form| %>
              <div class="form-group">
                <%= form.label :seo_title, t('admin.shared.seo_title') %>
                <%= form.text_field :seo_title, class: 'form-control' %>
              </div>
              <div class="form-group">
                <%= form.label :seo_description, t('admin.shared.seo_description') %>
                <%= form.text_area :seo_description, class: 'form-control' %>
              </div>
              <div class="form-group">
                <%= form.label :og_title, t('admin.shared.og_title') %>
                <%= form.text_field :og_title, class: 'form-control' %>
              </div>
              <div class="form-group">
                <%= form.label :og_description, t('admin.shared.og_description') %>
                <%= form.text_area :og_description, class: 'form-control' %>
              </div>
              <div class="form-group">
                <%= form.label :og_image, t('admin.shared.og_image') %>
                <div class="row">
                  <div class="col-lg-12">
                    <%= image_tag(form.object.og_image.url, style: 'width: 100px') if form.object.og_image? %>
                  </div>
                </div>
                <%= form.file_field :og_image %>
                <%= form.hidden_field :og_image_cache %>
              </div>
            <% end %>
            <div class="form-group">
              <%= f.submit t('admin.actions.submit'), class: 'btn btn-success' %>
              <%= link_to t('admin.actions.cancel'), admin_page_path(@page) , class: 'btn btn-default' %>
            </div>
          <% end %>
        </div>
    

    如果我从我的 SeoSetting 模型,一切正常。似乎Rails不喜欢这个部分: f.object.build_seo_setting ,因为它在我的数据库中创建了一个记录。我有什么办法可以解决这个问题吗?谢谢。

    2 回复  |  直到 7 年前
        1
  •  0
  •   SRack    7 年前

    看起来问题就在这里:

    accepts_nested_attributes_for :seo_setting, update_only: true
    

    你只允许更新 seo_setting 更新时。

    然后,当您使用此代码时:

    f.object.seo_setting ||= f.object.build_seo_setting
    

    你又回到了新的生活 镶嵌镶嵌 如果缺少关联的对象。

    要使其工作,您需要移除 update_only: true ,或者仅当 SEO_设置 已经存在。

        2
  •  0
  •   Alex Zakruzhetskyi    7 年前

    只需更改此行:

    <%= f.fields_for :seo_setting, f.object.seo_setting ||= f.object.build_seo_setting do |form| %>
    

    对于这一个:

    <%= f.fields_for :seo_setting, @page.seo_setting.nil? ? @page.build_seo_setting : @page.seo_setting do |form| %>
    
    推荐文章