【问题标题】:Nested Associations and simple_form嵌套关联和 simple_form
【发布时间】:2025-11-24 19:10:01
【问题描述】:

一直在完成教程的最后一部分:https://www.youtube.com/watch?v=wOIQDO1yF80

使用 Rails 4.2.6

任务是为书评应用创建一个评论系统。刚刚完成以下

创建了评论模型并添加了关联 belongs_to :book belongs_to :user

创建了一个嵌套路由 resources :books do resources :reviews end

创建了评论控制器 `类评论控制器

def new
    @review = Review.new
end

def create
    @review = Review.new(review_params)
    @review.book_id = @book_id
    @review.user_id = current_user.id

    if @review.save
        redirect_to book_path(@book)
    else
        render 'new'
    end
end

private

    def review_params
        params.require(:review).permit(:rating, :comment)
    end

    def find_book
        @book = Book.find(params[:book_id])
    end

结束`

创建了部分表单_form.html.erb

<%= simple_form_for([@book, @book.reviews.build]) do |f| %> <%= f.input :rating %> <%= f.input :comment %> <%= f.button :submit %> <% end %>

创建了一个 _partial 视图来显示评论 <p><%= review.rating %></p> <p><%= review.comment %></p>

在我的书 show.html.erb 文件中添加了指向我的评论“simple_form”&lt;%= link_to "Add Review", new_book_review_path(@book) %&gt; 的链接

添加了代码以在我的书 show.html.erb 文件中呈现与该书相关的所有评论 &lt;%= render @book.reviews %&gt;

问题是当我从评论 _form.html.erb 提交评论时, book_id 始终为空,因此它不会在图书页面上显示评论。这是我输入的最后一条记录的控制台输出。

Review Load (1.0ms) SELECTreviews.* FROMreviewsORDER BYreviews.idDESC LIMIT 1 => #<Review id: 13, rating: 4, comment: "Testing", created_at: "2016-06-18 02:10:23", updated_at: "2016-06-18 02:10:23", user_id: 1, book_id: nil> irb(main):007:0>

我没有收到任何错误消息。我可以手动将 book_id 输入到数据库中的记录中,它们会正确显示,但是问题是当我提交表单时 book_id 正在传递。

我认为问题是两个方面之一。

评论_form.html.erb&lt;%= simple_form_for([@book, @book.reviews.build]) do |f| %&gt;

注意:当我提交评论时,user_id 被正确存储,看起来它们是在同一个地方定义的(在评论控制器中)

def create
    @review = Review.new(review_params)
    @review.book_id = @book_id
    @review.user_id = current_user.id

    if @review.save
        redirect_to book_path(@book)
    else
        render 'new'
    end
end

任何帮助将不胜感激!

【问题讨论】:

  • 你的模型中有attr_accessor :book_id吗?
  • 我没有看到@book_id 来自哪里?
  • @Petr - review.rb 有class Review &lt; ActiveRecord::Base belongs_to :book belongs_to :user end
  • @Marv-C - 我在 reviews_controller.rb 的开头做了一个`before_action :find_book`,它调用了一个具有以下属性的private动作。 ` def find_book @book = Book.find(params[:book_id]) end`
  • 如果您只需要已经在参数中传递的 book_id,则无需查找 book。同样在您的 before_action 中,我看不到 @book_id 的设置位置

标签: ruby-on-rails nested associations simple-form


【解决方案1】:

我想通了。愚蠢的错误,但我花了很长时间才弄清楚。

在创建操作中我有@review.book_id = @book_id,应该是@review.book_id = @book.id

感谢小伙伴们的帮助。

【讨论】: