동적으로 제어되는 양식 만들기: 백엔드

5011 단어 railsruby
지난 게시물에서 레시피 앱을 만들기 위해 React 앱에서 동적으로 제어되는 양식 구성 요소를 만드는 단계를 자세히 설명했습니다. 그러나 이는 해당 정보를 서버에 저장하는 데 필요한 것의 절반에 불과합니다. 이 게시물에서는 동적으로 제어되는 양식의 정보를 받아들이는 Ruby on Rails의 컨트롤러를 구축하는 방법을 살펴보겠습니다.

레시피 만들기



컨트롤러에서 create 메소드를 작성하십시오. 이 생성 방법은 새 레시피를 생성하는 데 사용됩니다.


   def create
       new_recipe_params = {
           title: params[:title],
           summary: params[:summary],
           user_id: params[:user_id]

       }
       recipe = Recipe.create(new_recipe_params)
       create_ingredients(params[:ingredients], recipe.id)
       create_steps(params[:steps], recipe.id)
       render json: { recipe: RecipeSerializer.new(recipe)}
   end


새 레시피의 매개변수는 다음과 같습니다.
  • 제목
  • 요약
  • 사용자 ID
  • 성분
  • 단계

  • 보시다시피 이 메서드는 제목, 요약 및 user_id 데이터를 가져오고 구성 요소 및 단계에 대해 도우미 메서드를 사용합니다. 또한 양식 권한을 처리하는 개인 메서드가 있습니다.

    
    private
    
       def recipe_params
           params.require(:recipe).permit(:title, :summary, :user_id, :steps=> [], :ingredients=>[])
       end
    
    


    재료는 프런트 엔드의 양식에서 배열로 저장됩니다. 레시피에 추가하기 위해 create_ingredient 메소드는 해당 배열을 거쳐 이름과 양 정보를 사용하여 각 요소에 대한 재료를 생성합니다. 그런 다음 삽 연산자는 새 재료를 레시피의 재료 속성에 추가합니다.

    def create_ingredients(array, id)
           recipe = Recipe.find(id)
           array.each do |ingredient|
               new_ingredient = Ingredient.create({recipe_id: id, name: ingredient[:name], amount: ingredient[:amount]})
               recipe.ingredients << new_ingredient
           end
       end
    


    create_steps 메소드는 유사한 논리를 사용합니다.

      def create_steps(array, id)
           recipe = Recipe.find(id)
           array.each do |step|
               new_step = Step.create({recipe_id: id, step_summary: step[:step_summary]})
               recipe.steps << new_step
           end
       end
    


    레시피 표시 중



    show 메소드를 사용하면 새로 생성된 레시피를 볼 수 있습니다.

     def show 
            @recipe = Recipe.find(params[:id])
            if @recipe
                render json: {recipe: @recipe, ingredients: @recipe.ingredients, steps:@recipe.steps }
            else 
                render json: { error: "That recipe does not exist...yet"}, status: :not_acceptable
            end
        end
    


    이것은 레시피를 만들고 표시하는 데 작동하지만 레시피를 편집하는 것은 어떻습니까?

    레시피 편집



    편집 경로는 레시피를 찾습니다.

       def edit
           @recipe = Recipe.find(params[:id])
           render json: @recipe
       end
    


    create 메소드와 마찬가지로 update 메소드도 재료 및 단계 속성에 대한 도우미 메소드가 필요합니다.

       def update
            @recipe = Recipe.find(params[:id])
    
            edit_ingredients(params[:ingredients], @recipe.id)
            edit_steps(params[:steps], @recipe.id)
    
            @recipe.update(recipe_params)
    
            render json: @recipe
        end
    


    edit_ingredients 메소드는 create 메소드와 유사합니다. 먼저 재료를 찾은 다음 업데이트된 재료에 업데이트를 적용합니다. 다시 말하지만, 업데이트된 재료는 레시피에 삽질됩니다.

       def edit_ingredients(array, id)
            recipe = Recipe.find(id)
            if recipe.ingredients
                array.each do |ingredient|
                    if ingredient[:id]
                        updated_ingredient = Ingredient.update({recipe_id: id, name: ingredient[:name], amount: ingredient[:amount]}) 
                    else 
                       updated_ingredient = Ingredient.create({recipe_id: id, name: ingredient[:name], amount: ingredient[:amount]})
                        recipe.ingredients << updated_ingredient
                    end 
                end 
            end
        end
    


    다시, edit_steps 메소드는 edit_ingredients 메소드와 동일한 패턴을 따릅니다.

       def edit_steps(array, id)
            recipe = Recipe.find(id)
            if recipe.steps
                array.each do |step|
                    if step[:id]
                        updated_step = Step.update({recipe_id: id, step_summary: step[:step_summary]}) 
                    else 
                        updated_step = Step.create({recipe_id: id, step_summary: step[:step_summary]})
                        recipe.steps << updated_step
                    end 
                end 
            end
        end
    
    


    레시피 삭제



    그에 비해 파괴 방법은 비교적 간단합니다.

       def destroy 
            @recipe = Recipe.find(params[:id])
            if @recipe 
                @recipe.destroy 
                render json: {message: "Recipe successfully deleted"}
            else 
                render json: {message: "Failed to destroy recipe"}
            end
        end
    


    결론



    동적으로 제어되는 양식에서 정보를 추가하려면 컨트롤러에서 도우미 메서드를 사용하여 정보를 가져옵니다. edit 메소드는 또한 동적 정보에 대한 도우미 메소드를 사용합니다. 컨트롤러 로직을 구현한 후 새 레시피가 백엔드에 저장됩니다.

    좋은 웹페이지 즐겨찾기