2015-07-20 54 views
0

我有嵌套屬性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 

Poll_controller:

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 

我安裝寶石繭:

接下來我創建視圖new.html.haml:

​​

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_items的字段。我認爲不呈現形式poll_items_fields.html.haml。但爲什麼?如何修復?

回答

2

如果我理解正確的,你的new方法應該是這樣的

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

,你也有unswer而不是answerpoll_items_attributes,所以解決這個問題了。

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軌道4使用強參數

而且也是此行@poll = Poll.new params[poll_params]create方法應該是這樣@poll = Poll.new(poll_params)

+0

謝謝!爲什麼添加你@ poll.poll_items.build?這個邏輯是什麼意思?我使用rails v。3.2 –