2017-10-16 50 views
1

一個在Admin::SettingsController創造新的紀錄,我想創建一個新的調查記錄,如果一個不存在,或更新現有的調查記錄。什麼是最好的的Rails來處理的創建和查找方式是什麼?我的錯誤背部 No route matches [POST] "/admin/settings"#UPDATE方法,如果不存在

edit_admin_settings_path GET  /admin/settings/edit(.:format) admin/settings#edit 
admin_settings_path   PATCH /admin/settings(.:format) admin/settings#update 
          PUT  /admin/settings(.:format) admin/settings#update 

路線

resource :settings,   only: [:edit, :update] 

控制器

class Admin::SettingsController < Admin::BaseController 
    before_action :load_survey 

    def edit 
    @survey = Survey.find_or_initialize_by(id: params[:id]) unless @survey 
    end 

    def update 
    @survey.update_attributes!(params_for_create_or_update) 
    flash[:notice] = 'Survey updated' 
    redirect_to action: :edit 
    end 

protected 

    def load_survey 
    @survey = Survey.last || Survey.new 
    end 

    def params_for_create_or_update 
    params.require(:survey).permit(
     :name, 
     :link, 
     :language_id 
    ) 
    end 
end 

回答

3

find_or_create_by方法請看:

def update 
    @survey = Survey.find_or_create_by(id: params[:id]) 
    @survey.update_attributes!(params_for_create_or_update) 
    flash[:notice] = 'Survey updated' 
    redirect_to action: :edit 
    end 

這將試圖找到一條記錄與特定id並創建一個,如果它不存在。然後,您可以根據需要更新該記錄。

編輯

你也可以使用find_or_initialize_by這就要求new實例我使用一個單一的資源,而不是create

+0

對象: 因此,而不是'resources'我使用'資源:調查,只:[:編輯,:更新]'。因此,編輯路徑是'管理/調查/ edit',而不是通過'http://lvh.me:3000 /管理/調查/:ID/edit'。如果我轉到'admin/surveys/edit'並且沒有當前的調查記錄,我該如何呈現表單? – VegaStudios

+0

豈不是最好的,如果該記錄的存在是爲了使'new'但隨後在後臺檢查,並根據需要更新呢? – Cyzanfar

+0

我更新了主帖以保持格式。使用'find_or_create_by'將允許在提交時創建一個空記錄到數據庫。使用'find_or_initialize_by'呈現POST路由錯誤@cyzanfar – VegaStudios