Rails-如何为nasted表创建视图

时间:2015-11-02 08:39:13

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

我想在show.html.erb中获取这样的数据,但它不起作用。 如何从现场表中获取数据?

这是代码。

show.html.erb

<% @planaction.each do |action| %>

        <hr>
        <%= action.spot.name %>
        <%= action.spot.description %>
        <hr>

        <%= action.title %>
        <%= action.experience %>

<% end %>

plan.rb

class Plan < ActiveRecord::Base

  has_many :plan_actions

end

plan_action.rb

class PlanAction < ActiveRecord::Base
  belongs_to :plan
  has_one :spot
end

spot.rb

class Spot < ActiveRecord::Base
  belongs_to :plan_action
end

plan_actions_controller.erb

class PlanPagesController < ApplicationController
  def show
    @plan = Plan.find(params[:id])
    @planaction = @plan.plan_actions
  end
end

,此处出现错误消息

未定义的方法`name&#39;为零:NilClass

这里是spot table的迁移文件。

    class CreateSpots < ActiveRecord::Migration
  def change
    create_table :spots do |t|
      t.integer :spot_id
      t.integer :plan_action_id
      t.string :name
      t.text :description
      t.time :time_open
      t.time :time_close
      t.date :dayoff
      t.string :address
      t.integer :tel
      t.string :image
      t.string :image2
      t.string :image3

      t.timestamps null: false
    end
  end
end

2 个答案:

答案 0 :(得分:0)

对我来说很好看。

问题可能是(无法查看您的日志,但无法确定)plan_action没有关联的spot记录。< / p>

要解决此问题,您应该使用一些条件逻辑:

<% @planaction.each do |action| %>
    <hr>
    <% if action.spot %>
       <%= action.spot.name %>
       <%= action.spot.description %>
       <hr>
    <% end %>

       <%= action.title %>
       <%= action.experience %>
<% end %>

同样,这是猜测。我写了答案,因为我觉得最好提供一些关于如何解决它的想法。以上应该有效。

答案 1 :(得分:0)

我还认为Rich Peck在spot表中没有记录,其中plan_action_id对应于计划操作。

遵循rails惯例,我建议如下:

class PlanAction < ActiveRecord::Base
  belongs_to :plan
  has_one :spot

  delegate :name, :description, to: :spot, prefix: true, allow_nil: true
end

并在您看来:

<%= action.spot_name %>
<%= action.spot_description %>

最后,更正您的验证。例如,如果plan_action应该有一个点,那么您需要使用嵌套表单进行现场和计划操作。