【问题标题】:Create controller method with accepts_nested_attributes_for and fields_for使用 accept_nested_attributes_for 和 fields_for 创建控制器方法
【发布时间】:2018-05-25 13:01:19
【问题描述】:

我正在使用 Rails 5.2.0 构建一个关于食谱的 Web 应用程序,我对控制器的 create 方法有疑问。

这是我的模型:

class Recipe < ApplicationRecord
    belongs_to :user
    has_many :quantities
    has_many :ingredients, through: :quantities

    accepts_nested_attributes_for :quantities, allow_destroy: true
end

class Quantity < ApplicationRecord    
    belongs_to :recipe
    belongs_to :ingredient
end

class Ingredient < ApplicationRecord
    has_many :quantities
    has_many :recipes, through: :quantities
end

这里是创建新食谱的视图:

<%= form_for(@recipe) do |f| %>

    <%= f.label :name, "Name" %>
    <%= f.text_field :name %>

    <%= f.label :servings, "Servings" %>
    <%= f.number_field :servings %>


    <%= f.fields_for :quantities do |quantity| %>

        <%= f.hidden_field :_destroy, class: "hidden-field-to-destroy" %>

        <%= f.label :ingredient_id, "Ingredient Name" %>
        <%= f.text_field :ingredient_id%>

        <%= f.label :amount, "Amount" %>
        <%= f.number_field :amount %>

        <%= f.label :unit, "Unit" %>
        <%= f.select(:unit, ["kg","g","l","ml"], {include_blank: true}) %>
    <% end %>

    <%= f.submit 'Add new recipe' %>

<% end %>

我可以使用 jquery 动态添加新成分,也可以以相同的形式删除它们。

控制器的update方法完美运行,但create方法不起作用:

class RecipesController < ApplicationController
    def create
        @recipe = current_user.recipes.build(recipe_params)
        if @recipe.save
            flash[:success] = "New recipe created correctly."
            redirect_to @recipe
        else
          render 'new'
        end
    end 

    def update
        @recipe = Recipe.find(params[:id])
        if @recipe.update_attributes(recipe_params)
          flash[:success] = "The recipe has been updated correctly."
          redirect_to @recipe
        else
          render 'edit'
        end
    end

    private
        def recipe_params
            params.require(:recipe).permit( :name, :servings, quantities_attributes: [:ingredient_id, :amount, :unit,:_destroy, :id, :recipe_id])
        end
end

我正在尝试执行@recipe = current_user.recipes.build(recipe_params),但在视图中出现以下错误:

  • 数量配方不能为空

我认为出现这种情况是因为在尝试创建关系时,需要指明recipe_id,但尚未创建recipe,无法指明id。

您能否告诉我首先创建配方的正确方法是什么,然后能够通过配方​​控制器的 create 方法中的 Quantity 添加成分?

【问题讨论】:

    标签: ruby-on-rails associations nested-attributes


    【解决方案1】:

    根据分享的消息,qunatity_recipes 不能为空,并且您没有指定任何条件来管理它。

    当前

    class Recipe < ApplicationRecord
     belongs_to :user
     has_many :quantities
     has_many :ingredients, through: :quantities
    
     accepts_nested_attributes_for :quantities, allow_destroy: true
    end
    

    将接受嵌套属性更新为配方类的 allow_nil

    class Recipe < ApplicationRecord
     belongs_to :user
     has_many :quantities
     has_many :ingredients, through: :quantities
    
     accepts_nested_attributes_for :quantities, allow_destroy: true, allow_nil: true
    end
    

    【讨论】:

    • 我尝试按照您告诉我的操作,但收到以下错误:Unknown key: :allow_nil. Valid keys are: :allow_destroy, :reject_if, :limit, :update_only
    • 尝试添加 :reject_if => :all_blank
    • 我仍然遇到同样的错误,但是感谢您的评论,我已经查看了模型并且我注意到了这一点:validates: recipe_id, presence: true。我已经消除了它,一切正常。非常感谢您的回复,感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多