Я пытаюсь сделать приложение с 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
Мои проблемы являются:
когда я сохраняю все это и попробовать его, каждый раз, когда я обновить профиль, он создает новая запись для квалификаций, поэтому список квалификаций отображается дублирующимся при каждом обновлении (даже если обновление не добавлено в поля).
Когда я обновляю форму профиля и удаляю квалификацию, она не удаляется из массива. Я могу удалить их в консоли, но не используя форму.
Я беспокоюсь, что если я удалю
@profile.qualifications_build unless @profile.qualifications
от действия редактирования в контроллере профиля, я не буду иметь возможность обновлять эти атрибуты.
Кроме того, для меня не имеет смысла, что удаление будет решить проблему с удалением квалификаций. Должен ли я добавить что-то к ссылке удаления, чтобы заставить ее удалить запись?