драгоценный камень кокона не передает параметры

Поэтому, хотя я успешно использовал кокон раньше, я все еще относительно новичок и по какой-то причине не могу заставить его пройти через параметры (я пробовал с двумя разными приложениями и на Fedora 22 и Mac 10.10.4) .

Для контекста я использовал стандартные формы rails в .erb и имею как :post, так и :post_items, которые в настоящее время имеют только описание. Я использую кокон 1.2.6.

Итак, в application.js у меня есть

//= require cocoon

в пост.рб

class Post < ActiveRecord::Base
  has_many :post_items
  accepts_nested_attributes_for :post_items, :reject_if => :all_blank, :allow_destroy => true

  validates :title, :post_items, presence: true
  validates :title, length: {maximum: 255}
end

в post_item.rb

class PostItem < ActiveRecord::Base
    belongs_to :post
end

и мои соответствующие контроллеры (posts_controller.rb):

def index
  @post = Post.new
end

def create
  params[:post][:ip_address] = request.remote_ip
  @post = Post.create(post_params)

  if @post.save
    flash[:success] = "Your post was successfully created"
    redirect_to @post
  else
    flash[:failure] = "There was an error saving your post"
    render 'index'
  end
end

private

def find_post
  @post = Post.find(params[:id])
end

def post_params
  params.require(:post).permit(:title, :tags, :hits, :ip_address, post_items_attributes: [:id, :description, :_destroy])
end

И, наконец, в моих представлениях у меня есть (_form.html.erb)

<%= form_for @post, html: {multipart: true} do |f| %>
    <% if @post.errors.any? %>
        <p>There were <%= @post.errors.count %> errors</p>
        <% @post.errors.full_messages.each do |msg| %>
            <p><%= msg %></p>
        <% end %>
    <% end %>
           <!-- a bunch of fields here -->
<div class="six columns">
    <h3>Add images</h3>
    <div id="post_items">
        <% f.fields_for :post_items do |post_item| %>
            <%= render 'post_item_fields', f: post_item %>
        <% end %>
        <div class="links">
            <%= link_to_add_association 'Add Image', f, :post_items, class: "add-button" %>
        </div>
    </div>
    <%= f.button :submit, class: "button submit-button" %>
<% end %>

и, наконец, _post_item_fields.html.erb

<div class="nested-fields">
  <div class="field">
    <%= f.label :description %>
    <%= f.text_area :description %>
  </div>
  <%= link_to_remove_association "Remove", f %>
</div>

Есть файлы CSS, которые изменяют html, но у меня нет js, кроме того, что создается автоматически. Я буквально застрял в этой проблеме уже несколько дней, и я не могу понять, что не так. Я пробовал post.rb без кода проверки, но он все еще не работает.

Единственное, что у меня есть, это то, что когда вы распечатываете параметры, он уже отбрасывает параметры post_items, и я не могу понять, почему.

Спасибо за помощь!

EDIT: ради информации я добавил свои миграции.

в БД/мигрировать/20150722191917_create_post_items.rb

class CreatePostItems < ActiveRecord::Migration
  def change
    create_table :post_items do |t|
      t.string :description
      t.belongs_to :post, index: true, foreign_key: true
    end
  end
end

и в db/migrate/20150722173629_create_posts.rb

class CreatePosts < ActiveRecord::Migration
  def change
    create_table :posts do |t|
      t.string :title
      t.string :tags
      t.integer :hits, null: false, default: 0
      t.string :ip_address

      t.timestamps null: false
    end
    add_index :posts, :ip_address
  end
end

Также, если это имеет значение, я не использовал леса при их создании.


person haxonek    schedule 23.07.2015    source источник
comment
какую ошибку вы получаете?   -  person Suavocado    schedule 23.07.2015
comment
Кроме того, правильно ли назван ваш файл post_items.html.erb? Это должно быть _post_items.html.erb для работы в качестве частичного   -  person Suavocado    schedule 23.07.2015
comment
О да, я написал имена файлов не так, как я их случайно сохранил; Я собираюсь быстро отредактировать пост, чтобы он содержал правильные частичные имена, которые я использовал.   -  person haxonek    schedule 23.07.2015
comment
Итак, поля отображаются, но не сохраняются правильно?   -  person Suavocado    schedule 23.07.2015
comment
да так что ошибок нет, просто не сохраняет post_items в пост. В противном случае страницы загружаются правильно, и если я удалю проверки, он создаст сообщение, которое просто не будет включать post_items.   -  person haxonek    schedule 23.07.2015
comment
Я также могу создавать post_items через консоль, поэтому я предполагаю, что БД работает   -  person haxonek    schedule 23.07.2015
comment
Сделай мне одолжение и попробуй это. Оберните link_to_remove в div и попробуйте.   -  person Suavocado    schedule 23.07.2015
comment
Я сделал, и это все еще не сработало; хотя удалить ссылку никогда не было проблемой; проблема в том, что вложенные элементы не сохраняются вместе с публикацией. (также документы на самом деле не требуют этого) Спасибо за идею, хотя   -  person haxonek    schedule 23.07.2015
comment
Я знаю, что кокон во многом зависит от представления. стоит попробовать. Я продолжу копать, дай мне минутку.   -  person Suavocado    schedule 23.07.2015
comment
попробуйте переименовать :description в :post_item_description в базе данных, контроллере и представлении. Это сработало для меня   -  person Suavocado    schedule 24.07.2015
comment
Также убедитесь, что post_items имеет post_id:integer   -  person Suavocado    schedule 24.07.2015
comment
Спасибо за идею, но пока ничего; Я собираюсь попробовать post_id сейчас, хотя он отображается в консоли, поэтому я думаю, что он добавляется с post:belongs_to при первом создании модели.   -  person haxonek    schedule 24.07.2015
comment
да, добавление его вручную только переопределяет метод own_to, поэтому post_id существует независимо:/   -  person haxonek    schedule 24.07.2015
comment
у вас есть это в репо? Я посмотрю, когда выйду с работы.   -  person Suavocado    schedule 24.07.2015
comment
Нет репо; хотя я добавил миграции, если это поможет   -  person haxonek    schedule 24.07.2015
comment
Единственное, что я заметил, это то, что у вас нет @post.post_images.build, который требуется.   -  person Pavan    schedule 24.07.2015


Ответы (1)


Ну, я думаю, что наконец понял, что не так (хотя я действительно не понимаю, что мы должны сделать, чтобы обойти это), что как только я избавился от div class="six columns", это сработало, так что, очевидно, это было вмешательство в способность кокона драгоценных камней анализировать html.

Спасибо всем за помощь!

РЕДАКТИРОВАТЬ: чтобы уточнить, мне пришлось изменить _form.html.erb на:

<%= form_for @post, html: {multipart: true} do |f| %>
    <% if @post.errors.any? %>
        <p>There were <%= @post.errors.count %> errors</p>
        <% @post.errors.full_messages.each do |msg| %>
            <p><%= msg %></p>
        <% end %>
    <% end %>
           <!-- a bunch of fields here -->
    <h3>Add images</h3>
    <div id="post_items">
        <% f.fields_for :post_items do |post_item| %>
            <%= render 'post_item_fields', f: post_item %>
        <% end %>
        <div class="links">
            <%= link_to_add_association 'Add Image', f, :post_items, class: "add-button" %>
        </div>
    </div>
    <%= f.button :submit, class: "button submit-button" %>
<% end %>

Так что я думаю, что это была небольшая моя ошибка, так как ошибку было бы легче обнаружить, если бы я использовал полный html вместо того, чтобы анализировать его для битов, относящихся к кокону, но это неважно. (в основном мораль этой истории в том, что вы не можете иметь div внутри формы)

person haxonek    schedule 24.07.2015
comment
Несколько вещей: кокон не анализирует HTML. Кокон только помогает в построении формы. При публикации формы ваш браузер соберет все поля внутри формы, поэтому, если это не удастся, я предполагаю, что ваш html был создан неправильно. Легко проверяется: что отправлено в контроллер, если он содержит поля, у вас проблемы с сильными параметрами, если нет, у вас проблема с html. Кроме того: вполне возможно использовать множество div внутри формы. Однако вы не можете вкладывать формы в формы (чистое ограничение html). Так что простое удаление одного div не может быть объяснением имхо. - person nathanvda; 29.07.2015