【问题标题】:Dont display fields nested attributes with using gem cocoon不要使用 gem cocoon 显示字段嵌套属性
【发布时间】:2015-07-20 16:02:40
【问题描述】:

我有带有嵌套属性 poll_items 的模型投票:

class Poll < ActiveRecord::Base
  ITEMS_COUNT_MAX = 5
  attr_accessible :from_date, :question, :results_hidden, :to_date, :owner_id, :poll_items_attributes

  belongs_to :owner, polymorphic: true
  has_many :poll_items, dependent: :destroy
  has_many :poll_votes, through: :poll_items

  accepts_nested_attributes_for :poll_items, allow_destroy: true, 
                                reject_if: proc { |attributes| attributes['answer'].blank? }

  #validates :owner, :question, :from_date, :to_date, presence: true
  #validate :validate_duplicate, on: :create
  validate :validate_max_poll_items, on: :update

  after_initialize :defaults
...................................................................

模型 pollItem

attr_accessible :answer
  attr_readonly :poll_votes_count

  belongs_to :poll
  has_many :poll_votes, dependent: :destroy
  has_many :users, through: :poll_votes

  validates :poll, :answer, presence: true
  validate :validate_duplicate, on: :create

  scope :editable, lambda { |u|
    unless u.moderator?
      where(:poll.owner.user_id => u.id).where(:created_at.gt Settings.edit_delay.minutes.ago)
    end
  }

  private
  def validate_duplicate
    errors.add(:base, :duplicate) unless poll.poll_items.where(answer: answer).empty?
  end
end

投票控制器:

class PollsController < ApplicationController
  before_filter :authenticate_user!
  before_filter :set_poll, only: [:show, :edit, :update, :destroy]
  before_filter :find_owner, only: [:new, :create]

  def new
    @poll = Poll.new
  end

  def create
     @poll = Poll.new params[poll_params]
    #@poll.owner = @owner
    respond_to do |format|
      if @poll.save
        format.html { redirect_to [:edit, @poll], notice: 'Опрос был успешно создан.' }
      else
        format.html { render :new }
      end
    end
  end

  def show

  end

  def edit
      @poll.poll_items.build
  end

  def update
    if @poll.editable?(current_user)
      if @poll.update_attributes params[:poll]
        respond_to do |format|
          format.html { redirect_to [:edit, @poll], notice: 'Опрос был успешно обновлен.' }
        end
      else
        respond_to do |format|
          format.html { render :edit, alert: @poll.errors }
        end
      end
    end
  end

  def destroy
    @poll.destroy
    respond_to do |format|
      format.html { redirect_to @owner, notice: 'Опрос был успешно удален.' }
    end
  end

  private

  def poll_params
    params.require(:poll).permit(:from_date, :question, :results_hidden, :to_date, 
      :owner_id, poll_items_attributes: [:id, :unswer, :_destroy])
  end
  protected

  def set_poll
    @poll = Poll.find(params[:id])
    @owner = @poll.owner
  end

  def find_owner
    @owner = case
             when params[:post_id]
               Post.visible(current_user).find(params[:post_id])
             when params[:blog_post_id]
               BlogPost.with_privacy(current_user).find(params[:blog_post_id])
             end
  end
end

我安装了gem cocoon:

接下来我创建视图 new.html.haml:

%h1= title "Новый опрос"
= simple_form_for @poll do |f|
  = f.error_messages header_message: nil
  = f.input :question, disabled: !@poll.editable?(current_user), input_html: { class: 'input-block-level' }
  = f.input :results_hidden, as: :boolean, inline_label: 'Скрыть результаты до окончания опроса', label: false
  = f.input :from_date, as: :datetime, input_html: { class: 'poll_date' }
  = f.input :to_date, as: :datetime, input_html: { class: 'poll_date' }
  .items-index
    %h3#poll-items Варианты ответа (не больше пяти)
    = f.simple_fields_for :poll_items do |poll|
      = render 'poll_items_fields', f: poll
      = link_to_add_association 'Добавить еще вариант', f, :poll_items
  .form-actions
    = f.button :submit, 'Опубликовать опрос', class: 'btn-bg'
    %p
      Вернуться к посту:
      = link_to @owner

poll_items_fields.html.haml:

.poll_row
  .poll_item
    = f.input :answer, input_html: { class: 'ctrlenter expanding' }, label: false, placeholder: 'Введите вариант ответа'
    = link_to_remove_association "удалить", f

我打开新页面以创建新民意调查,但只有新名称 quation poll 和按钮“创建民意调查”的字段。没有用于添加 poll_items 的字段。我认为不要呈现表单 poll_items_fields.html.haml。但为什么?如何解决?

【问题讨论】:

    标签: ruby-on-rails nested-attributes cocoon-gem


    【解决方案1】:

    如果我理解正确,你的new 方法应该是这样的

    def new
      @poll = Poll.new
      @poll.poll_items.build
    end
    

    而且你在poll_items_attributes 中有unswer 而不是answer,所以也要修复它。

    def poll_params
      params.require(:poll).permit(:from_date, :question, :results_hidden, :to_date, :owner_id, poll_items_attributes: [:id, :answer, :_destroy])
    end
    

    更新:

    您还应该从您的 Poll 模型中删除 attr_accessible :from_date, :question, :results_hidden, :to_date, :owner_id, :poll_items_attributes,因为 Rails 4 使用 strong 参数

    而且create 方法中的这一行@poll = Poll.new params[poll_params] 应该看起来像这样@poll = Poll.new(poll_params)

    【讨论】:

    • 谢谢!!!为什么加你@poll.poll_items.build?这个逻辑是什么意思?我使用 rails v. 3.2
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-04
    • 1970-01-01
    • 1970-01-01
    • 2016-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多