所以一切都在提前工作。我剪了一个分支并进行了一些改变,我认为这不会影响这个海报属性,但是我收到了这个错误。我切换到主人,并没有合并任何东西,这是在我切断我上面提到的分支之前工作。我也得到了这个错误。
我不确定发生了什么事,也许我抽搐了一下,然后在某个地方进行击键,但我无法看到它。
它说错误发生在我的餐厅控制器中。我在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
我不确定是什么改变让我变得不明,但是如果有人可以提供帮助我会很感激。
谢谢!
答案 0 :(得分:1)
问题可能归结为两个潜在问题:
- 您的
冲突poster
属性与您的poster
关联- 您没有
醇>poster
属性
让我解释一下:
<强>协会强>
第一次看到你的代码时,我会推测你的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的对象,我们将其视为属性:
这意味着,如果您正在接收&#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