2016-06-18 136 views
1

我已經看到了這個類似問題的其他鏈接,但他們都沒有在我的情況下工作。Ruby on Rails - 編輯/更新創建新記錄,而不是更新

我的更新動作在MySQL數據庫中創建新記錄

我的應用程序包括3種型號

  1. FashionModel
  2. ModelProfile
  3. Measurement

它們被定義爲如下:

class FashionModel < ActiveRecord::Base 
    has_secure_password 
    has_one :model_profile 
    has_one :measurement 
    accepts_nested_attributes_for :model_profile 
    accepts_nested_attributes_for :measurement 
end 


class ModelProfile < ActiveRecord::Base 
    belongs_to :fashion_model 
end 


class Measurement < ActiveRecord::Base 
    belongs_to :fashion_model 
end 

fashion_model_controller.rb如下:

class FashionModelsController < ApplicationController 
    def new 
    @fashion_model = FashionModel.new 
    end 

    def create 
    @fashion_model = FashionModel.new(fashion_models_sign_up_params) 
    if @fashion_model.save 
     flash[:success] = "Welcome to Meriad" 
     session[:fashion_model_id] = @fashion_model.id 
     redirect_to edit_fashion_model_path(@fashion_model) 
    else 
     render 'new' 
    end 
    end 

    def edit 
    @fashion_model = FashionModel.find(params[:id]) 
    @fashion_model.build_model_profile 
    @fashion_model.build_measurement 
    end 

    def update 
    @fashion_model = FashionModel.find(params[:id]) 
    if @fashion_model.update(fashion_models_edit_params) 
     flash[:success] = "Saved!" 
     redirect_to fashion_model_path(@fashion_model) 
    else 
     render 'edit' 
    end 
    end 

    def show 
    @fashion_model = FashionModel.find(params[:id]) 
    end 

end 

fashion_model_edit_params

def fashion_models_edit_params 
    params.require(:fashion_model).permit(:first_name, 
              :last_name, 
              :email, 
              :password, 
              model_profile_attributes: [:id, 
                    :location, 
                    :bio, :gender, 
                    :phone_number, 
                    :rate, 
                    :profile_image, 
                    :birthdate], 
              measurement_attributes: [:id, 
                    :feet, 
                    :inches, 
                    :bust, 
                    :waist, 
                    :hips, 
                    :dress, 
                    :shoes, 
                    :hair, 
                    :eyes]) 
    end 

我想在這些線路上的東西:

  • 在F ashion模型簽約通過new.html.erb應用程序(存儲在fashion_models表)

  • index.html.erb包含所有fashion_models的列表,編輯信息的選項(更新他們的個人資料)

  • edit.html.erb包含model_profiles表以及measurements表,這兩個表都具有fashion_models表的外鍵。

fashion_models/new.html.erb模板是包含first_namelast_nameemailpassword非常簡單。

fashion_models/edit.html.erb模板是一樣的東西:

<%= form_for @fashion_model do |f| %> 
    # fashion_model fields here 

    <%= f.fields_for :model_profile do |t| %> 
    # model_profile fields here 
    <% end %> 

    <%= f.fields_for :measurement do |t| %> 
    # measurement fields here 
    <% end %> 

<% end %> 

現在,每當我編輯fashion_model/:id,在model_profilemeasurement在數據庫中創建一個新的記錄,而不是更新現有記錄。另外,當我在Edit Profile頁面上時,沒有任何字段預填充現有數據。我必須再次手動輸入所有數據。

首先,我認爲這是因爲build方法,但是當我刪除它們時,fields_for不顯示。

感謝任何幫助!

回答

0

所以,我終於想出了一個辦法做到這一點。希望它能幫助別人。

我的問題是,我有一個form_for內有2 fields_for,我需要更新2個模型以這些形式。

我厭倦了使用回調如after_action :create_model_profileafter_action :create_measurement。在這兩種方法中,我試圖將fashion_model_id保存爲新創建的fashion_model:id

但由於回調被認爲是代碼味道,我想要一個更好的解決方案。

而不是創造一個form_for @fashion_models的,我寫了一個輔助方法如下

# app/helpers/form_helper.rb 
module FormHelper 
    def setup_fashion_model(fashion_model) 
    fashion_model.model_profile ||= ModelProfile.new 
    fashion_model.measurement ||= Measurement.new 
    fashion_model 
    end 
end 

,並在我的form_for我用類似

form_for(setup_fashion_model(@fashion_model)) do |f| 
    ... 
end 

這是否創造了ModelProfile一個新實例,並Measurement沒有堅持在數據庫中。

當然,它解決了預先填充包含數據的字段的問題。

就是這樣。簡單的解決方案,但我一直在那裏撓我的頭。 希望它有幫助。

1

你可能正在弄亂他們的路線。

它的工作原理是這樣的:

  • form_for電話@fashion_model.new_record?

  • 如果爲真:將提交給POST /fashion_model,並創建一個對象。

  • 如果假:它將提交到PUT /fashion_model/:id,並更新一個對象。

正如你所看到的,它只是取決於對象是否已經存在於數據庫中。因此,請再次檢查,您在哪裏使用form_for以及您傳遞的是哪個對象。

對於路線的問題,請參見:http://guides.rubyonrails.org/routing.html

+0

感謝您的幫助,但我不認爲我搞砸了路線。我有一個fashion_models的資源。 正如你所說我有一個創建和投入/補丁更新 –

+0

@PradyumnaShembekar發佈請求如果'form_for'創建對象,這是因爲它假設該對象不在數據庫中,您可以打印頁面當然,放在表格之前:'

<%= @ fashion_model.persisted? %>

' –

+0

謝謝。是的,我只是通過導軌控制檯嘗試。我現在擔心的是,因爲我正在將我的/新的或註冊頁面直接重定向到我的編輯頁面,所以我無法實例化ModelProfile和Measurement。我在結束新動作並將fashion_model_id設置爲@ fashion_model.id之前嘗試創建它們,但仍然無法做到這一點。你是否認爲之前的行動可以滿足這種需求 –

相關問題