gpt4 book ai didi

ruby-on-rails - Rails 5 - 使用多态关联 - 呈现 View

转载 作者:数据小太阳 更新时间:2023-10-29 07:18:16 26 4
gpt4 key购买 nike

我正在尝试学习如何在我的 Rails 5 应用程序中使用多态关联。我最近问 this问题,但我编辑了很多次以显示我正在尝试的所有内容,它变得凌乱

我有称为组织、提案和包::Bip 的模型。

这些协会是:

组织

has_many :bips, as: :ipable, class_name: Package::Bip
accepts_nested_attributes_for :bips, reject_if: :all_blank, allow_destroy: true

提议
has_many :bips, as: :ipable, class_name: Package::Bip
accepts_nested_attributes_for :bips, reject_if: :all_blank, allow_destroy: true

包::Bip
belongs_to :ipable, :polymorphic => true, optional: true #, inverse_of: :bip

Package::Bip 可以与 Organization 或 Proposal 相关联。我正在努力弄清楚如何在我的提案展示中展示仅属于提案的 Package::Bips,对于组织来说也是如此。

我的 package::bip 表有以下两列:
#  ipable_id      :integer
# ipable_type :string

ipable_type 被设置为 Proposal 或 Organisation。

在我的提案秀中,我有:
<% if @proposal.bips.present? %>
<%#= render @proposal.bips %>
<%= link_to proposal_package_bips_path(@proposal) do %>
<% end %>
<% end %>

我找到了 this邮政。我理解这意味着我也应该能够尝试这个:我也尝试过:
<% if @proposal.bips.present? %>
<%= render @proposal.bips %>
<% end %>

我认为 (@proposal) 应该是决定返回哪些 package_bip 实例的约束因素。但是,它不是。我不确定它在做什么,因为所有 package_bips 都被渲染(包括那些与组织相关的)。

在我的提案 Controller 中,我有:
 def index
@proposals = Proposal.all
# @bips = @proposal.bips
# authorize @proposals
end


def show
@bips = @proposal.bips#.where(ipable_type: 'Proposal')
end

在我的 Package::BipsController 中,我有
def index

if params[:ipable_type] == "Proposal"
@bips = Package::Bip.where(:ipable_type == 'Proposal')
else params[:ipable_type] == 'Organisation'
@bips = Package::Bip.where(:ipable_type == 'Organisation')
end

但是,当我保存所有这些并尝试它时,我得到了错误的结果。

目前,数据库中有 4 个 Package::Bip 实例。
Package::Bip.pluck(:ipable_type)
(0.8ms) SELECT "package_bips"."ipable_type" FROM "package_bips"
=> ["Proposal", "Proposal", "Proposal", "Organisation"]

3 个属于提案,1 个属于组织。

属于提案的 3 个分别属于不同的提案。
Package::Bip.pluck(:ipable_id)
(0.8ms) SELECT "package_bips"."ipable_id" FROM "package_bips"
=> [15, 13, 16, 1]

我的目标是提案展示 View 或组织展示 View 应该只显示属于该特定提案的 Bips。

但是,当我呈现我的提案显示 View 时,它具有:
<%= link_to proposal_package_bips_path(@proposal) do %> 

反过来,我的 views/package/bips/index.html.erb 有:
<% @bips.each do |ip| %>
<%= ip.title.titleize %>
<%#= link_to 'More details', package_bip_path(ip) %>

我希望此 View 呈现包含 1 个 package_bip 实例的列表。相反,我列出了所有 4 个实例(proposal.bips 中的 2 个属于不同的提案,其中一个 bips 属于一个组织)。这些都不应该在索引中呈现。

此外,我无法在 bips/index.html.erb 中添加指向 bips/show.html.erb 的链接。这是因为该链接如下所示:
<%= link_to 'More details', package_bip_path(ip) %> <

当我尝试渲染包含该链接的索引时,我收到一条错误消息:
undefined method `package_bip_path' for #<#<Class:0x007fbce68389c0>:0x007fbcfdc31c18>

我认为链接可能需要包含提案或组织。

我的路线是嵌套的:
resources :proposals do 
namespace :package do
resources :bips
end

resources :organisations do
namespace :package do
resources :bips
end

在控制台中,我可以使用要应用的过滤器进行搜索。
p = Proposal.last
Proposal Load (4.8ms) SELECT "proposals".* FROM "proposals" ORDER BY "proposals"."id" DESC LIMIT $1 [["LIMIT", 1]]
=> #<Proposal id: 16, user_id: 4, title: "test tenor", description: "test tenor", created_at: "2016-11-08 21:58:38", updated_at: "2016-11-08 21:58:38">
2.3.1p112 :199 > p.bips
Package::Bip Load (0.3ms) SELECT "package_bips".* FROM "package_bips" WHERE "package_bips"."ipable_id" = $1 AND "package_bips"."ipable_type" = $2 [["ipable_id", 16], ["ipable_type", "Proposal"]]
=> #<ActiveRecord::Associations::CollectionProxy [#<Package::Bip id: 19, identifier: "test tenor", description: nil, conditions: "test tenor", ipable_id: 16, ipable_type: "Proposal", created_at: "2016-11-08 21:58:38", updated_at: "2016-11-08 21:58:38", title: "test tenor", status: nil, classification: "Copyright">]>
2.3.1p112 :200 > p.bips.count
(3.5ms) SELECT COUNT(*) FROM "package_bips" WHERE "package_bips"."ipable_id" = $1 AND "package_bips"."ipable_type" = $2 [["ipable_id", 16], ["ipable_type", "Proposal"]]
=> 1

但这不会在我的任何尝试中延续到代码中。

任何人都可以向我推荐可以帮助我弄清楚如何设置我的多态 View 的资源,以便它们可以正确过滤,以便我可以使用典型的索引链接(例如,显示/编辑),以便它们可以被识别为属于一个或另一个提案/组织?

更新

我现在找到了 this邮政。

我尝试采用它建议的过程:
  • 将提案 Controller 中的创建操作更改为:

    定义创建
    如果参数[:organisation_id]
    parent = Organisation.find(params[:organisation_id])
    elsif 参数[:proposal_id]
    parent = Proposal.find(params[:proposal_id])
    结尾
    bip = Package::Bip.new
    Package::Bip.ipable = parent
    # @bip = Package::Bip.new(bip_params)
    # authorize @bip

    respond_to do |format|
    if @bip.save
    format.html { redirect_to @bip }
    format.json { render :show, status: :created, location: @bip }
    else
    format.html { render :new }
    format.json { render json: @bip.errors, status: :unprocessable_entity }
    end
    end

    结束
  • 将提案 View 更改为:


  • 当我尝试这个时,我没有得到任何错误,但是所有的 Package::Bips 都显示在提案展示 View 中。

    尽管存在具有组织 ID 的 Package::Bips。
    Package::Bip.all.pluck(:ipable_type)
    (0.9ms) SELECT "package_bips"."ipable_type" FROM "package_bips"
    => ["Proposal", "Proposal", "Proposal", "Organisation", "Proposal"]

    当我重新启动服务器并重试时,我收到一条错误消息,内容为:
    undefined method `empty?' for #<Class:0x007ff20920e218>

    错误消息指向我的新行:
    <%= polymorphic_path(@proposal, Package::Bip) %>

    日志显示:
    Started POST "/__better_errors/3f34303f5f5c670f/variables" for ::1 at 2016-11-13 10:58:13 +1100
    Package::Bip Load (0.4ms) SELECT "package_bips".* FROM "package_bips" WHERE "package_bips"."ipable_id" = $1 AND "package_bips"."ipable_type" = $2 [["ipable_id", 15], ["ipable_type", "Proposal"]]

    post显示了一个类似的问题,可以通过在路径中添加 '[]' 来解决。

    当我然后尝试:
    <%= link_to polymorphic_path([@proposal, Package::Bip]) do  %>

    我仍然得到所有 bips 的列表(即使是那些属于一个组织或具有不同 id 的提案)。

    我从日志中看到的可能是一个线索(如果是的话 - 它超出了我的头脑)。
    Started GET "/proposals/15/package/bips" for ::1 at 2016-11-13 11:24:32 +1100
    Processing by Package::BipsController#index as HTML
    Parameters: {"proposal_id"=>"15"}
    User Load (1.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2 [["id", 4], ["LIMIT", 1]]
    Rendering package/bips/index.html.erb within layouts/application
    Package::Bip Load (0.6ms) SELECT "package_bips".* FROM "package_bips"
    Rendered package/bips/index.html.erb within layouts/application (5.4ms)

    日志似乎没有显示任何迹象表明它正在将提案或提案 ID 过滤器应用于 package_bips。

    这对我来说没有任何意义,因为我的路由只能使用组织或提案的前缀:
    rake routes | grep package_bip
    organisation_package_bips GET /organisations/:organisation_id/package/bips(.:format) package/bips#index
    new_organisation_package_bip GET /organisations/:organisation_id/package/bips/new(.:format) package/bips#new
    edit_organisation_package_bip GET /organisations/:organisation_id/package/bips/:id/edit(.:format) package/bips#edit
    organisation_package_bip GET /organisations/:organisation_id/package/bips/:id(.:format) package/bips#show
    proposal_package_bips GET /proposals/:proposal_id/package/bips(.:format) package/bips#index
    new_proposal_package_bip GET /proposals/:proposal_id/package/bips/new(.:format) package/bips#new
    edit_proposal_package_bip GET /proposals/:proposal_id/package/bips/:id/edit(.:format) package/bips#edit
    proposal_package_bip GET /proposals/:proposal_id/package/bips/:id(.:format) package/bips#show

    此外,当我尝试在最后一个链接帖子中使用显示路径时,在我的 views/package/bips/index.html.erb 中:
     <% @bips.each do |ip| %>
    <%= link_to polymorphic_path([@ipable, ip]) %>

    然后我收到一个错误消息:
    undefined method `package_bip_path' for #<#<Class:0x007f9e8ac29248>:0x007f9e939c9508>

    TARYN 搜索问题的建议

    背景。在我的提案 Controller 中,我的提案被定义为:
    def set_proposal
    @proposal = Proposal.find(params[:id])
    end

    在控制台中,我尝试:
    params = {:proposal_id => 15}
    => {:proposal_id=>15}


    2.3.1p112 :031 > @proposal = Proposal.find(params[:proposal_id])
    Proposal Load (0.7ms) SELECT "proposals".* FROM "proposals" WHERE "proposals"."id" = $1 LIMIT $2 [["id", 15], ["LIMIT", 1]]
    => #<Proposal id: 15, user_id: 4, title: "testing filter", description: "testing filter", byline: "testing filter", nda_required: true, created_at: "2016-11-08 00:59:09", updated_at: "2016-11-08 00:59:09">

    2.3.1p112 :033 > @proposal.bips
    Package::Bip Load (0.7ms) SELECT "package_bips".* FROM "package_bips" WHERE "package_bips"."ipable_id" = $1 AND "package_bips"."ipable_type" = $2 [["ipable_id", 15], ["ipable_type", "Proposal"]]
    => #<ActiveRecord::Associations::CollectionProxy [#<Package::Bip id: 17, identifier: "testing filter", description: nil, conditions: "testing filter", ipable_id: 15, ipable_type: "Proposal", created_at: "2016-11-08 00:59:09", updated_at: "2016-11-08 00:59:09", title: "testing filter", status: nil, classification: "Patent">, #<Package::Bip id: 21, identifier: "dd", description: nil, conditions: "dd", ipable_id: 15, ipable_type: "Proposal", created_at: "2016-11-10 22:47:54", updated_at: "2016-11-10 22:47:54", title: "ldsjflkjklsdjfl", status: nil, classification: "Design">]>
    2.3.1p112 :034 > @proposal.bips.count
    (6.3ms) SELECT COUNT(*) FROM "package_bips" WHERE "package_bips"."ipable_id" = $1 AND "package_bips"."ipable_type" = $2 [["ipable_id", 15], ["ipable_type", "Proposal"]]
    => 2

    这给出了正确的结果。

    在提案 Controller 中,显示 Action ,我有:
    def show
    @images = @proposal.images
    byebug
    puts 'testing proposal controller'
    @bips = @proposal.bips#.where(ipable_type: 'Proposal')
    end

    当我尝试这个时,我可以探索提案参数:
    params
    <ActionController::Parameters {"controller"=>"proposals", "action"=>"show", "id"=>"15"} permitted: false>
    (byebug) proposal_params
    *** ActionController::ParameterMissing Exception: param is missing or the value is empty: proposal

    nil

    其他遇到此问题的人将其归因于他们强大的 params 方法中的“require”语句。

    我的 proposal_params 定义为:
    def proposal_params
    params.require(:proposal).permit(:title, :description, :byline, :nda_required, :randd_maturities_list,
    #Package
    bips_attributes: [:id, :status, :classification, :identifier, :conditions, :title, :_destroy,
    tenor_attributes: [:id, :express_interest, :commencement, :expiry, :enduring, :repeat, :frequency, :_destroy]

    ],


    )
    end

    我认为它是正确的。

    不过,这些消息很奇怪,因为我还可以查看再见错误声明中的每个列入白名单的项目并获得正确的响应。例如:
     @proposal.id
    15

    当我尝试在 Package::bips Controller 、索引操作中使用 bye 错误进行探索时,我可以看到:
    params.inspect
    "<ActionController::Parameters {\"controller\"=>\"package/bips\", \"action\"=>\"index\", \"proposal_id\"=>\"15\"} permitted: false>"

    allowed: false 属性似乎是我代码中的一个问题。

    这是我的下一个查询。

    最佳答案

    答案在这里:https://rubyplus.com/articles/3901-Polymorphic-Association-in-Rails-5

    诀窍似乎在文章中显示的 load_commentable 方法中。这对我来说太复杂了,无法理解,但它确实有效。

    非常感谢人们乐于分享他们所知道的知识。谢谢塔林和巴拉。

    关于ruby-on-rails - Rails 5 - 使用多态关联 - 呈现 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40518887/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com