使用视图在模型之间传输变量

时间:2009-05-10 03:53:46

标签: ruby-on-rails ruby

我正在创建一个非常简单的书评网站,它需要能够允许用户添加关于图书的小评论。现在我有两个表,一个用于本书,一个用于注释,现在需要一种方法在两者之间传输数据,因为我发现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不是我用过的语言。)

5 个答案:

答案 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 %>

您无需在控制器中找到注释。