轨道4上的未知属性ruby

时间:2017-03-10 23:24:37

标签: ruby-on-rails ruby activerecord

因此,我一直在尝试为用户添加评论部分,以便在婚礼场地添加评论。我一直在网上关注如何执行此操作的教程,但是,我一直陷入同样的​​困境。

错误:

Showing C:/Sites/Innovative_WeddingsLatest/app/views/comments/_form.html.erb where line #1 raised:

unknown attribute 'venue_id' for Comment.
Trace of template inclusion: app/views/venues/show.html.erb

Rails.root: C:/Sites/Innovative_WeddingsLatest

Application Trace | Framework Trace | Full Trace
app/views/comments/_form.html.erb:1:in `_app_views_comments__form_html_erb___721803434_50744988'
app/views/venues/show.html.erb:32:in `_app_views_venues_show_html_erb___40167619_56734404'

这是我的代码:

class CommentsController < ApplicationController
def create
    @venue = Venue.find(params[:venues_id])
    @comment = @venue.comments.create(params[:comment].permit(:name, :body))

    redirect_to venue_path(@venue)
end

评论模型:

class Comment < ActiveRecord::Base
belongs_to :venues
end

地点模型:

class Venue < ActiveRecord::Base
#check if user has left venue field blank, if so show error "cannot be blank"
validates :venue, :presence => {:message => "cannot be blank ..."}
#validates :name, presence: true, uniqueness: true

has_many :bookings
has_many :comments
end

浏览/评论/ _form.html.erb

<%= form_for([@venue, @venue.comments.build]) do |f| %>

<p>
    <%= f.label :name %>
</p>

<p>
    <%= f.label :body %><br>
    <%= f.text_area :body %>
</p>
<br>

<p>s
    <%= f.submit %>
</p>

<% end %>

查看/地点/ show.html.erb

<p id="notice"><%= notice %></p>
<!-- when user clicks on "show" information of the specific venue is displayed on a single page --> 
</br>
</br>
</br>
</br>

<p>
  <strong>Venue:</strong>
  <%= @venue.venue %>
</p>

<p>
  <strong>Description:</strong>
  <%= @venue.description %>
</p>

<p>
  <strong>Price:</strong>
  <%= number_to_currency @venue.price, unit: "£" %>
</p>

<p>
    <%# if not @venue.img_url.blank? %>
      <strong>Img url:</strong>
      <%#= image_tag @venue.img_url, :size => "180x250" %>
    <%# else %>
        <%#= image_tag "no-image.jpg", :size => "180x250" %>
    <%# end %>
</p>

    <%= render 'comments/form' %>

<%= link_to 'Edit', edit_venue_path(@venue) %> |
<%= link_to 'Back', venues_path %>

评论迁移:

    class CreateComments < ActiveRecord::Migration
  def change
    create_table :comments do |t|
      t.string :name
      t.text :body
      t.references :venues

      t.timestamps null: false
    end
  end
end

P.S。对不起它是第一次使用这个论坛,所以可能看起来不是最好的:(

如果需要更多代码来解决问题,请告诉我:D

提前致谢:)

3 个答案:

答案 0 :(得分:1)

您的迁移说t.references :venuest.references(model)将在此处创建名为“#{model} _id”的表t上的外键。这意味着您的外键是“venues_id”,但您想要的是“venue_id”。只需将t.references :venues单一化为t.references :venue

这解释了为什么错误为评论说“未知属性'venue_id'。”由于您有“venues_id”而不是“venue_id”,因此venue_id属性不存在

确保在重新运行rake db:rollback之前回滚迁移(rake db:migrate)。

答案 1 :(得分:0)

请在评论模型中更正您与belongs_to :venue的关联,并根据迁移到t.references :venue更改迁移 由评论模型中的迁移生成的字段将是&#39; venue_id&#39;你准备好了!!

答案 2 :(得分:0)

您的迁移说t.references :venuest.references(model)将在表t上创建一个名称为#{model}_id的外键。这意味着您的外键是venues_id,但是您想要的是venue_id。只需将t.references :venues单个化为t.references :venue

这说明了为什么错误显示为unknown attribute 'venue_id' for Comment.的原因,因为您拥有venues_id而不是venue_id,所以venue_id属性不存在。

确保在重新运行rake db:rollback之前回滚迁移(rake db:migrate)。

OR

您可以简单地将t.references的迁移表从venues更改为venue,然后在终端机rake db:migrate:redo中运行此命令。 这会将您的架构表更改为您在迁移文件中所做的最新更改。