我正在尝试创建用户可以使用的食谱应用程序。该应用程序的一部分是管理员用户可以创建食谱和说明。
有一个包含所有用户的用户模型/表。这有一个 控制器。
还有一个食谱表,其中包含创建的所有食谱。
最后有一个指令表,每个指令表都与一个相关联 食谱
我想要实现的是管理员用户访问页面来创建菜谱。此页面还有现有食谱的列表。用户可以单击其中一个菜谱,这会将用户带到编辑页面,在其中他们可以编辑该菜谱的说明。编辑页面显示指令列表。您还可以添加说明。
问题是配方创建页面上的
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>
当你在表单中传递 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 条基本路线 index、show、new、edit、create、update 和 destroy 的快速方法。请参阅从外部进行的导轨布线
如果您有两张不同的表格,一张用于食谱,一张用于说明,则您的食谱模型中必须具有:
has_many :instructions
并且在您的说明模型中您必须具有:
belongs_to :recipes
当然,您还必须具有所需的外键来建立这两个表之间的关系。然后,当您创建新食谱时可以执行以下操作:
@recipe.instructions << params[:instructions]
请参阅 活动记录关联