我正在创建一个非常简单的书评网站,它需要能够允许用户添加关于图书的小评论。现在我有两个表,一个用于本书,一个用于注释,现在需要一种方法在两者之间传输数据,因为我发现rails处理事情的方式非常令人费解。
所以我的书模型包含“has_many:comments” 我的评论模型有:“belongs_to:book”
我用来查看和添加评论的视图是“/views/book/viewbook.html.erb”
这显示了本书及其所有细节,在底部是一个用户可以添加自己的注释的部分,它看起来像这样:
<%= form.text_field :title %>
<%= form.text_area :body %>
<%= submit_tag "Add Comment", :class => "submit" %>
现在我知道这不起作用,因为上面的“:title”和“:body”会出现在书籍模型中,但我需要将它们发送到评论模型,因为它们在评论数据库中。如何将此数据传递到评论数据库。我试过“:comment.title”和其他各种各样的东西,但仍然无法锻炼如何传递这些数据。
任何想法都会非常感激。
(如果这个问题非常愚蠢或者没有得到很好的解释,我很抱歉,我的讲师设定了这个任务并且rails不是我用过的语言。)
答案 0 :(得分:2)
您可以在开始表单标记中定义表单的用途:
<% form_for :comment do |form| %>
<%= form.text_field :title %>
<%= form.text_area :body %>
<%= submit_tag "Add Comment", :class => "submit" %>
<%= end %>
这个想法是表单是一个空的注释对象。控制器在模型和视图之间进行通信,因此控制器应该有一个操作来处理知道将注释对象保存到注释模型中的表单。您还需要指定评论所针对的书。有很多方法可以处理这个问题(隐藏字段,嵌套RESTful资源等)。
也许从这里开始:http://guides.rubyonrails.org/action_controller_overview.html
答案 1 :(得分:0)
听起来你需要使用嵌套的对象形式。这是Rails 2.3中的一个新功能:
http://ryandaigle.com/articles/2009/2/1/what-s-new-in-edge-rails-nested-attributes
答案 2 :(得分:0)
所以我使用你的好建议修改了它,现在只出现了一个问题。虽然我现在可以成功地存储评论标题,正文,时间以及将评论留给数据库的人,但仍然无法确定如何使用存储book.id.以下是观点:
<% form_for :comment, :url => { :action => "addcomment" } do |form| %>
<%= form.hidden_field :user_id, :value => session[:user_id] %>
<%= form.hidden_field :book_id, :value => @book.id %> <!-- WONT WORK -->
<%= form.label "Title" %><%= form.text_field :title %><br />
<%= form.label "Comment" %><%= form.text_area :comment %>
<%= submit_tag "addComment", :class => "submit" %>
<% end %>
除了book.id
之外,我的控制器现在可以成功存储详细信息def addcomment
@newcomment = Comment.new(params[:comment])
if @newcomment.save
flash[:notice] = "Comment Was Added To The System."
redirect_to :action => "index"
end
end
我虽然“@ book.id”会起作用,因为在那个视图中我也会使用“@ book.title”和“@ book.authour”之类的东西来展示书籍细节,这似乎有效,但不是但是ID字段。
答案 3 :(得分:0)
现在可以成功发布评论并使用正确的详细信息存储它们,现在我可以使用“book_id”值显示该特定书籍的评论列表。这是我认为可行的,我在我的应用程序的搜索部分也有这样的代码所以我认为它会很好:
def view
@book = Book.find(params[:id])
@reviews = Comment.find_by_book_id(@book.id)
end
使用相应的视图:
<% if @reviews %>
<% for review in @reviews %>
<%= form.label "Title: " %><%h review.title %> <br />
<%= form.label "Review:" %><%h review.comment %>
<% end %>
<% end %>
现在应该获得具有我正在查看的书籍的“book_id”的评论,并使用for循环显示每个评论。虽然不是很有效,但它会发出一条错误消息,说明以下内容:
#undefined method `each' for #<Comment:0xb682c2f4>
#Extracted source (around line #27)
第27行是
<% for review in @reviews %>
答案 4 :(得分:0)
要找到一本书的评论,那就是:
@book = Book.find(params[:id])
就像你已经完成的那样:
@book.comments
对于那些书籍的评论。所以:
<% for review in @book.comments %
<%= form.label "Title: " %><%h review.title %> <br />
<%= form.label "Review:" %><%h review.comment %>
<% end %>
您无需在控制器中找到注释。