Rails4:通过与另一个对象的关联,创建和编辑对象到form_for帮助器

时间:2014-02-27 04:17:50

标签: ruby-on-rails form-for controller-actions

我有2个模型通过连接表相互关联:

class Book < ActiveRecord::Base
  has_many :reviews
  has_many :readers, through: :libraries 
end

class Reader < ActiveRecord::Base
  has_many :reviews
  has_many :books, through: :reviews 
end

class Reviews < ActiveRecord::Base
  belongs_to :reader
  belongs_to :book
end

评论包含以下列:

  • content
  • reader_id
  • book_id

书籍控制器(book#show)中的show动作定义如下:

def show
  @book = book.find[:id]
end

主要思想是这样的: 读者必须阅读一本书来阅读它(没有书?读者不能写书评论)

在book的show for show(show.html.erb)中,我可以同时访问属于书籍的评论和读者对象:

书评

<% @book.reviews.each do |review| %>
<%= review.content %> written by <%= review.reader.name %>

每个人都可以看到图书的个人资料,但只有登录并购买图书的人才能查看图书。我必须使用@review对象的form_for帮助器,它位于我的共享文件夹中(在视图下)。我的form_for帮助器我的@review对象如下所示:

<%= form_for(review) do |f| %>
  <div class="field">
    <%= f.text_area :content, placeholder: "compose new review" %>
  </div>
  <%= f.submit "Update", class: "btn btn-large btn-primary" %>
<% end %>

我的问题是: 我希望读者能够在书籍的个人资料页面(书籍#show)上编辑他们对书籍的评论。我有一个if / else语句,检查是否只有登录并购买了本书的读者才能创建/更新评论。它看起来像这样: 书评

<% @book.reviews.each do |review| %>
 <%= review.content %> | written by <%= review.reader.name %>
   <% if signed_in? && current_reader?(review.reader) %>
     <div class="row">
       <aside class="span4">
         <section>
           <%= render 'shared/review_form', review: review %>
         </section>
       </aside>
      </div>
    <% else %>
       #Do something else
    <% end %>
<%end%>

我收到错误此错误:

undefined method `model_name' for #<Class:0x007fe568871c70>

我认为这是因为上面的错误中的类是书,模型是@review?有人可以帮我弄清楚如何将我通过@book访问的审核对象传递给@review的form_for帮助器吗?

非常感谢!

1 个答案:

答案 0 :(得分:1)

您有一个form_for @review,但您没有在任何地方定义@review

我会改变这一行:

render 'shared/review_form'

将当前评论作为局部变量传递给partial:

render 'shared/review_form', review: review

然后您可以将review_form更改为form_for review

相关问题