在Rails 4应用程序中嵌套模型的表单问题

时间:2014-07-27 21:38:00

标签: ruby-on-rails ruby ruby-on-rails-4

好吧,过去几个小时我一直在撞墙,试图解决这个问题。我有一个rails电子商务应用程序...商店列出了产品对象,当您将产品添加到购物车(另一个对象)时,它会通过创建line_item对象来添加。当您准备结账时,购物车中的line_items将成为订单。此时,我正在尝试允许客户提供page_url(将使用产品/服务的外部网站)[通过form_for text_field]到每个line_item。为了实现这一点,我创建了一个名为Page_url的新模型,该模型属于该订单。这就是我所遭受的失败(我不断得到控制器错误"未定义的方法`page_url'"):

这是表格:

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

......

  <% @items.each do |item| %> 
   <td><a> Provide the URL the <%= item.product.title %> will be added to</a></td> 
    <div class="field">
     <%= f.fields_for @order, :page_url do |q| -%>
      <td> <%= q.label :page_url %>
      <%= q.text_field :page_url, size: 80 %>
    </td>
    <% end %>
   </div>
  <% end %>
  </div>

  <div class="actions">
    <%= f.submit t('.submit') %>
  </div>
<% end %>

orders_controller:

 class OrdersController < ApplicationController
  skip_before_action :authorize, only: [:new, :create]
  include CurrentCart
  before_action :set_cart, only: [:new, :create]
  skip_before_action :set_order, only: [:create, :update, :destroy]

  ......

   # GET /orders/new
  def new
   if @cart.line_items.empty?
      redirect_to store_url, notice: "Your cart is empty"
      return
    end
  @items = @cart.line_items
  @order = Order.new
  @page_urls = @order.page_urls

 .....

def order_params
  params.require(:order).permit(:name, :address, :email, :pay_type,
                                :page_urls_attributes => [:page_url, :product_id,])
end

Pages_url控制器是Rails 4生成的标准控制器

Order.rb:

class Order < ActiveRecord::Base
has_many :line_items, dependent: :destroy
has_many :page_urls, dependent: :destroy
# ...
validates :name, :address, :email, presence: true
validates :pay_type, inclusion: PAYMENT_TYPES

accepts_nested_attributes_for :page_urls

Page_url.rb:

class PageUrl < ActiveRecord::Base
belongs_to :order

我感谢任何帮助,谢谢

1 个答案:

答案 0 :(得分:0)

我通常使用simple_form来创建关联,并且效果很好。

这样你就可以<%= f.association :page_urls %>

他们有很好的文档,请在此处查看:https://github.com/plataformatec/simple_form在协会下。

还有一点:

在Order模型中,我会指定类。

has_many :page_urls, dependent: :destroy, :class_name => PageUrl

要使用simple_form创建嵌套表单,请参阅:

https://github.com/plataformatec/simple_form/wiki/Nested-Models

希望这有帮助!