【问题标题】:Triple Nested Attribute Forms in RailsRails 中的三重嵌套属性形式
【发布时间】:2020-06-27 01:58:25
【问题描述】:

我看到了一些关于三重嵌套路由的事情,但无法在表单级别弄清楚。我的所有其他工作似乎都在工作,包括视图,而不是表单。所以我想做的是创建一个 Rails 应用程序,我可以在其中添加 Group>Classification>Item

我已经设置了 has_many 和 belongs_to 的模型。我关注了:https://www.digitalocean.com/community/tutorials/how-to-create-nested-resources-for-a-ruby-on-rails-application

关于如何设置嵌套表单。我有两个级别的工作完美。一旦我到达第三个,我可以查看索引但我无法添加。我有一种感觉,它要么是我的控制器,要么是我的 form_with 模型。我都试过了:

<%= form_with(model: [@group, @classification, item], local: true) do |form| %>
<%= form_with(model: [@classification, item], local: true) do |form| %>

在我拥有的项目的控制器中

before_action :get_group_classification

Private
def get_group_classification
   @classification= Classification.find(params[:classification_id])
end

路线设置如下

  resources :groups do
    resources :classifications do
      resources :items
        end
  end
  

任何想法将不胜感激。我不想超过 3 层,但不知道这是否是糟糕的协议。

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    在父模型中:

    class Group < ActiveRecord::Base
      belongs_to :add_on_slider
      has_many :classifications, dependent: :destroy
      accepts_nested_attributes_for :classifications, allow_destroy: true, :reject_if => :all_blank
    end
    
    

    在父控制器中:

     def grouo_params
        params.require(:group).permit(:attribute name1, :attribute name2, :sub_title, classifications_attributes: [:id, :main_point, :_destroy, :important_id ,items_attributes: [:id, :attribute, :_destroy, :important_id]])
     end
    

    在查看页面中: 您可以使用 gem 'cocon'。你可以看到任何与之相关的教程。 https://www.youtube.com/watch?v=56xjUOAAZY8

    【讨论】:

      【解决方案2】:

      你当然可以这样做,问题是你是否有任何额外的好处嵌套路由这么深。我过去看到的值得这样做的主要用例是授权由父属性处理(在您的情况下,如果项目的授权是通过组处理的)。

      一种无需过多参与路由的更简单方法是将group_idclassification_id 作为表单中的参数传递(例如hidden_field_tag)。

      最后,这取决于您要实现的目标以及您可能遇到的其他限制,这些限制在您发布的代码中并不明显。

      【讨论】:

      • 昨晚我正在考虑这个问题。但是关于如何路由的任何建议?通过观点的特殊性。因此,如果我在“组”页面上选择一个组并进入该组,我想要几个可以添加和编辑的特定于该组的分类,然后每个分类都有特定于该分类和整个组的项目。但是,某些项目可能也可以分配给其他分类。但我只是希望它看起来很容易导航,而不会让别人对如何使用它感到困惑。
      • 这将是浅层路由的用例(请参阅guides.rubyonrails.org/routing.html#shallow-nesting)。这样,您将在 URL 中拥有 group_idclassification_id,这样您就可以访问它们并将它们作为隐藏字段注入到表单中。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多