2016-01-11 5 views
1

Я пытаюсь сделать приложение с Rails 4.Rails 4 - вложенные атрибуты с Cocoon жемчужиной

Я использую Кокон камень для вложенных форм с простой формой.

У меня есть модель квалификаций, вложенная в модель профиля. Ассоциации являются:

Квалификация

belongs_to :profile 

Профиль

has_many :qualifications 
    accepts_nested_attributes_for :qualifications, reject_if: :all_blank, allow_destroy: true 

В моем профиле форме, я включаю квалификации атрибуты с:

<%= f.simple_fields_for :qualifications do |f| %> 

       <%= render 'qualifications/qualification_fields', f: f %> 
      <% end %> 

В моей квалификации формируют атрибуты, я имеют:

<div class="nested-fields"> 
<div class="container-fluid"> 

      <div class="form-inputs"> 

      <div class="row"> 
       <div class="col-md-6"> 
        <%= f.input :title, :label => "Your award" %> 
       </div> 

       <div class="col-md-6"> 


       </div> 


      </div> 

      <div class="row"> 
       <div class="col-md-8"> 
        <%= f.input :pending, :label => "Are you currently studying toward this qualification?" %> 
       </div> 
      </div>  

      <div class="row"> 
       <div class="col-md-4"> 
        <%= f.input :level, collection: [ "Bachelor's degree", "Master's degree", "Ph.D", "Post Doctoral award"] %> 
       </div> 




       <div class="col-md-4"> 
       <%= f.input :year_earned, :label => "When did you graduate?", collection: (Date.today.year - 50)..(Date.today.year + 5) %> 
       </div> 

      </div> 


      <div class="row"> 
       <div class="col-md-6"> 
        <%= link_to_remove_association 'Remove this qualification', f %> 
       </div> 

      </div> 


      </div> 

</div> 
</div>  

В мой контроллер профилей у меня есть:

def new 
    @profile = Profile.new 
    @profile.qualifications_build 
    @profile.build_vision 
    @profile.build_personality 
    @profile.addresses_build 
    authorize @profile 

    end 

    # GET /profiles/1/edit 
    def edit 
    @profile.build_personality unless @profile.personality 
    @profile.qualifications_build unless @profile.qualifications 
    @profile.build_vision unless @profile.vision 
    @profile.addresses_build unless @profile.addresses 
    end 

    # POST /profiles 
    # POST /profiles.json 
    def create 
    @profile = Profile.new(profile_params) 
    authorize @profile 

    respond_to do |format| 
     if @profile.save 
     format.html { redirect_to @profile } 
     format.json { render :show, status: :created, location: @profile } 
     else 
     format.html { render :new } 
     format.json { render json: @profile.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # PATCH/PUT /profiles/1 
    # PATCH/PUT /profiles/1.json 
    def update 

    # successful = @profile.update(profile_params) 

    # Rails.logger.info "xxxxxxxxxxxxx" 
    # Rails.logger.info successful.inspect 
    # [email protected] 
    # user.update.avatar 
    respond_to do |format| 
     if @profile.update(profile_params) 
     format.html { redirect_to @profile } 
     format.json { render :show, status: :ok, location: @profile } 
     else 
     format.html { render :edit } 
     format.json { render json: @profile.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # DELETE /profiles/1 
    # DELETE /profiles/1.json 
    def destroy 
    @profile.destroy 
    respond_to do |format| 
     format.html { redirect_to profiles_url } 
     format.json { head :no_content } 
    end 
    end 

    private 
    # Use callbacks to share common setup or constraints between actions. 
    def set_profile 
     @profile = Profile.find(params[:id]) 
     authorize @profile 
    end 

    # Never trust parameters from the scary internet, only allow the white list through. 
    def profile_params 
     params.require(:profile).permit(:title, :hero, :overview, :research_interest, :occupation, :external_profile, 
     :working_languages, :tag_list, 
      industry_ids: [], 
      user_attributes: [:avatar], 
      personality_attributes: [:average_day, :fantasy_project, :preferred_style], 
      vision_attributes: [ :long_term, :immediate_challenge], 
      qualifications_attributes: [ :level, :title, :year_earned, :pending, :institution, :_destroy], 
      addresses_attributes: [:id, :unit, :building, :street_number, :street, :city, :region, :zip, :country, :time_zone, :latitude, :longitude, :_destroy], 
      industries_attributes: [:id, :sector, :icon]) 
    end 
end 

Мои проблемы являются:

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

  2. Когда я обновляю форму профиля и удаляю квалификацию, она не удаляется из массива. Я могу удалить их в консоли, но не используя форму.

Я беспокоюсь, что если я удалю

@profile.qualifications_build unless @profile.qualifications 

от действия редактирования в контроллере профиля, я не буду иметь возможность обновлять эти атрибуты.

Кроме того, для меня не имеет смысла, что удаление будет решить проблему с удалением квалификаций. Должен ли я добавить что-то к ссылке удаления, чтобы заставить ее удалить запись?

ответ

1

Я думаю, что вы просто забыли добавить :id в допустимых параметров для квалификации, в вашем profile_params:

qualifications_attributes: [ :id, :level, :title, :year_earned, :pending, :institution, :_destroy] 

Без ID, чтобы соответствовать любой квалификации будет рассматриваться как новый.

 Смежные вопросы

  • Нет связанных вопросов^_^