我正在try 创建食谱应用程序,用户可以采取.该应用程序的一部分是管理用户创建食谱和说明.

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

  • 还有一个食谱表格,里面有所有创建的食谱.

  • 最后还有一个指令表,每个指令表都与一个 食谱

我正在努力实现的是管理员用户访问一个页面来创建一个食谱.这个页面也有一个现有食谱的列表.用户可以点击其中一个食谱,这会将用户带到一个编辑页面,在那里他们可以编辑食谱的说明.编辑页面显示指令列表.您还可以添加说明.

问题是配方创建页面上的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>

我认为是模型没有控制器的事实导致了这个问题?

推荐答案

<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>

当您在表单中传递100时,结果的表单操作是101,这是创建新食谱的路径,但您没有创建食谱的路径,或者至少我是这样认为的,您只显示了三条路径,一条是到管理员的路径,一条是显示编辑表单的路径,另一条是更新食谱的路径,最后这条必须是补丁或PUT路径,而不是POST.

创建如下所示的新管线:

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

尽管这可以解决你的问题,但这不是做你正在做的事情的正确方式.

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

此外,您还可以使用以下命令创建管线:

resources :users
resources :recipes

这是一种快速创建7条基本路由indexshowneweditcreateupdatedestroy的方法.见Rails routing from the outside

如果您有两个不同的表,一个用于配方,另一个用于说明,则配方模型中必须具有:

has_many :instructions

在您的说明模型中,您必须具备:

belongs_to :recipe

当然,你还必须有所需的外键来建立这两个表之间的关系.然后,当你创建一个新的食谱可以做这样的事情:

@recipe.instructions << params[:instructions]

Active Record Associations

Ruby-on-rails相关问答推荐

Ruby线程使用互斥处理并发问题

使用ImportMaps将HighLightJS添加到rails 7.1

删除 aws s3 (rails7) 上的日志(log)文件

Rails 创建自定义函数/方法以及存储位置

如何在 Arel 中重用单个绑定变量?

URL 中的 Rails slugs - 使用 Active Record Model Post 的 Title 属性而不是 ID

键入rails 控制台无法启动?

Rails 模型:您将如何创建一组预定义的属性?

控制器规格与请求规格?

bundle和gem安装的区别?

在公共 Rails 应用程序中将敏感数据存储在哪里?

URL中的Rails点而不是斜杠

带有 master.key 的 Rails 5.2 - Heroku 部署

在 Controller 中调用模型方法

Ruby on Rails:调试 rake 任务

设计自定义路由和登录页面

在 RoR 中引用同一个表的多个外键

资源和资源方法之间的区别

如何在 Rails 3 中订购包含的元素

使用 Rspec 测试关联的正确方法?