获取错误:未知属性:海报

时间:2014-09-07 04:39:24

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

所以一切都在提前工作。我剪了一个分支并进行了一些改变,我认为这不会影响这个海报属性,但是我收到了这个错误。我切换到主人,并没有合并任何东西,这是在我切断我上面提到的分支之前工作。我也得到了这个错误。

我不确定发生了什么事,也许我抽搐了一下,然后在某个地方进行击键,但我无法看到它。

它说错误发生在我的餐厅控制器中。我在show.index.html中使用了poster属性。

show.index.html:

<% @restaurant.reviews.reverse.each do |review| %>
posted by: <%= review.poster %><br />
written: <%= time_ago_in_words(review.created_at) %> ago<br />
Review:<br />
<%= review.article %><br /><br />
<% end %>

在我的restaurants_controller.rb中查看的方法:

def review
  @restaurant.reviews << Review.create!(review_params) ## <= this is the offending piece of code
  redirect_to :action => "show", :id => params[:id]
end

restaurants_controller.rb中的review_params方法:

def review_params
  params.require(:review).permit(:poster, :article)
end

我不确定是什么改变让我变得不明,但是如果有人可以提供帮助我会很感激。

谢谢!

1 个答案:

答案 0 :(得分:1)

问题可能归结为两个潜在问题:

  
      
  1. 您的poster属性与您的poster关联
  2. 冲突   
  3. 您没有poster属性
  4.   

让我解释一下:


<强>协会

第一次看到你的代码时,我会推测你的poster&#34;属性&#34;事实上,它会是一个ActiveRecord association。这意味着如果您调用 poster 方法,它将访问相关模型中的数据:

#app/models/review.rb
class Review < ActiveRecord::Base
   #fields id | poster_id | title | body | created_at | updated_at
   belongs_to :poster, class_name: "User"
   delegate :name, to: :poster, prefix: true #-> poster_name
end

#app/models/user.rb
class User < ActiveRecord::Base
   has_many :reviews
end

此关联将使您能够调用以下内容(考虑到您的数据库设置正确):

<% @restaurant.reviews.reverse.each do |review| %>
    <%= review.poster_name %>
<% end %>

<强>属性

关于您的属性问题 - 最重要的是您的poster模型/表中是否有一个名为Review的列。

  

为了给你一个更详细的解释,你必须记住Rails   是object-orientated框架(由于构建在Ruby上),这意味着每次都是   用它执行任何功能,它将&#34;构建&#34;对象为你。我们   将这些对象看作我们的Models,但实际上,它们只是Ruby   具有&#34;属性的类#34;附加到它们,具体取决于数据库。

你可以用this documentation最明显地看到这一点 - 每次初始化一个Rails / Ruby类时,它实际上都是&#34;构建&#34;一系列instance methods的对象,我们将其视为属性

enter image description here

这意味着,如果您正在接收&#34;未知属性&#34;错误,这意味着您的Model无法构建您想要的属性。对此的基本定义是您的数据库中没有正确的列,而且,您可以通过简单的修复(hack)解决。

我强烈建议您在数据库中创建迁移以填充海报列。但是,要查看这是否是问题,您可能希望使用attr_accessor来创建&#34;虚拟属性&#34;:

#app/models/review.rb
class Review < ActiveRecord::Base
   attr_accessor :poster #-> to test whether this will resolve the issue
end