如何在Rails中对没有控制器的多个模型使用form_with

问题描述 投票:0回答:1

我正在尝试创建用户可以使用的食谱应用程序。该应用程序的一部分是管理员用户可以创建食谱和说明。

  • 有一个包含所有用户的用户模型/表。这有一个 控制器。

  • 还有一个食谱表,其中包含创建的所有食谱。

  • 最后有一个指令表,每个指令表都与一个相关联 食谱

我想要实现的是管理员用户访问页面来创建菜谱。此页面还有现有食谱的列表。用户可以单击其中一个菜谱,这会将用户带到编辑页面,在其中他们可以编辑该菜谱的说明。编辑页面显示指令列表。您还可以添加说明。

问题是配方创建页面上的

form_with
显示错误:

undefined method `recipes_path'

我没有配方控制器。唯一的控制器是用户控制器。在这个控制器中,我定义了一个

admin
动作、一个
create_recipe
动作、一个
edit_recipe
动作和一个
update_recipe
动作:

def admin
        @recipe = Recipe.new(
            recipe_params
        )

        @Recipes = Recipe.all

    end

    def create_recipe

        if @recipe.save
            redirect_to root_url
        else
            render 'new'
        end

    end

    def edit_recipe
        @recipe = Recipe.find(params[:id])
    
        @recipe_instructions = RecipeInstructions.where(recipe_id: @recipe.id) 

    end

    def update_recipe
        @recipe = Recipe.find(params[:id])
        @recipe_instructions = RecipeInstructions.where(recipe_id: @recipe.id) 


        if @recipe.update(recipe_params)
           redirect_to root_url
        else
           render :edit
        end

路线如下:

  get 'admin', to: 'users#admin', as: :admin 
  get 'recipes/:id/edit', to: 'users#edit_recipe', as: :edit_recipe_instructions
  post 'recipes/:id/update', to: 'users#update_recipe', as: :update_recipe_instructions

这是菜谱页面的视图:

<div id = "signup-form-container">
        <%= form_with model: @recipe do |newRecipe| %>

        
                    <h3 class="signup-form-heds"> <%= newRecipe.label :recipe_name, "Recipe name" %></h3>
                    <%= newRecipe.text_field :recipe_name, class: "form-inputs form-text-inputs"%>
                
                <%= newRecipe.submit "SAVE", class: "btns submit-btns", id: "signup-submit-btn" %>
            <% end %>
        </div>

虽然我得到了错误。我还担心说明页面会发生类似的错误,因为我使用的是类似的表单,但有多个模型。

<%= form_with model: [@recipe, @recipe_instructions], url: update_recipe_instructions_path(@recipe) do |newRecipe| %>


            
                     <%= newRecipe.fields_for :recipe do |recipeData| %>
                       <h3 class="signup-form-heds"> <%= recipeData.label :recipe_name, "Recipe name" %></h3>
                      <%= recipeData.text_field :recipe_name, class: "form-inputs form-text-inputs"%>
                    <% end %>


                     <%= newRecipe.fields_for :recipe_instructions do |recipeInstructions| %>
                       <h3 class="signup-form-heds"> <%= recipeInstructions.label :instruction, "Instruction" %></h3>
                      <%= recipeInstructions.text_field :recipe_instructions , class: "form-inputs form-text-inputs"%>
                    <% end %>

                    
        
                <%= newRecipe.submit "SAVE", class: "btns submit-btns", id: "signup-submit-btn" %>
            <% end %>
        </div>

我认为是模型没有控制器导致了问题?

ruby-on-rails model-view-controller model form-with
1个回答
0
投票
<div id = "signup-form-container">
        <%= form_with model: @recipe do |newRecipe| %>

        
                    <h3 class="signup-form-heds"> <%= newRecipe.label :recipe_name, "Recipe name" %></h3>
                    <%= newRecipe.text_field :recipe_name, class: "form-inputs form-text-inputs"%>
                
                <%= newRecipe.submit "SAVE", class: "btns submit-btns", id: "signup-submit-btn" %>
            <% end %>
        </div>

当你在表单中传递 model: @recipe 时,得到的表单动作是 '/recipes',即创建新菜谱的路径,但你没有创建路径一个菜谱,或者至少我是这么认为的,您只显示三个路线,一个到管理员的路线,一个用于显示编辑表单,一个用于更新菜谱,最后一个必须是补丁或放置路线而不是发布.

创建一条新路线,例如:

post '/recipes', to: 'users#create' # this must be a post route because you will create a new recipe

尽管这可以解决您的问题,但这不是您正在做的事情的正确方法。

在用户控制器中,您正在创建配方,这是不正确的。在您的项目中,您可以有两个控制器,一个用于用户,一个用于食谱。

此外,您可以使用以下方式创建路线:

resources :users
resources :recipes

这是创建 7 条基本路线 indexshowneweditcreateupdatedestroy 的快速方法。请参阅从外部进行的导轨布线

如果您有两张不同的表格,一张用于食谱,一张用于说明,则您的食谱模型中必须具有:

has_many :instructions

并且在您的说明模型中您必须具有:

belongs_to :recipes

当然,您还必须具有所需的外键来建立这两个表之间的关系。然后,当您创建新食谱时可以执行以下操作:

@recipe.instructions << params[:instructions]

请参阅 活动记录关联

© www.soinside.com 2019 - 2024. All rights reserved.