0

我正在开发一个视频游戏数据库,用户可以在其中制作游戏条目、评分和评论。

为了评论某个游戏,评论对象需要获取该游戏的 id,以便与该特定游戏相关联。我定义了一个嵌套资源

  resources :games do
    resources :reviews
  end

在游戏的显示视图中,我有一个链接,它指向评论表单

link_to "Kritik verfassen", new_game_review_path(@game)

表单本身是这样定义的

<%= form_for(@review, :url => game_reviews_path(@game)) do |f| %>

  <div class="field">
    <%= f.text_area :content, placeholder: "Compose new review..." %>
  </div>

  <%= hidden_field_tag("game_id", @game.id) %>

  <%= f.submit "Post", class: "btn btn-large btn-primary" %>

<% end %>

但这会给我抛出运行时错误:“为 nil 调用 id,这会错误地为 4——如果你真的想要 nil 的 id,请使用 object_id”

我不明白为什么。我的 url 看起来像这样“localhost:3000/games/:id/reivews/new”,并且按照表单中的定义,该 url 获取“@game”属性。

这是我的评论控制器

  def create
    @game = Game.find_by_id(params[:id])
    @review = current_user.reviews.build(params[:review])
    @review.game_id = @game.id
    @review.user_id = current_user.id
    #@review = @game.reviews.build(params[:review])
    #@review.game_id = Game.find_by_id(params[:game_id])


    if @review.save
      flash[:success] = "review created!"
      redirect_to @review
    else
      render 'new'
    end
  end

  def new
    @review = Review.new(params[:review])
  end

我的模型中的关联设置正确,但为什么我的评论表没有收到相应的游戏 ID?它仅在我关闭“hidden_​​field_tag”但我需要游戏 ID 时才有效。然后在创建评论时也会发生错误,因为控制器中传递了 game.id。为什么 game.id 为零,我如何在这个嵌套的 url 中设置它?

我很感激任何帮助!

4

2 回答 2

1

我在这里发现了两个问题,以您的形式

<%= form_for(@review, :url => game_reviews_path(@game)) do |f| %>

无需通过@game 你只需要 :url => game_reviews_path

检查您的 rake 路线以找到确切的路径助手

二、来自game_id隐藏字段标签

<%= hidden_field_tag("game_id", @game.id) %>

您的params[:game_id]将给出游戏的 id,但在您的创建操作中,您正在执行此操作

 @game = Game.find_by_id(params[:id])
于 2013-04-17T21:34:42.760 回答
0

哦,是的,现在它正在工作!太感谢了。但我不得不承认控制器现在看起来有点多余

  def create
    @game = Game.find_by_id(params[:game_id])
    @review = current_user.reviews.build(params[:review])
    @review.game_id = @game.id
    @review.user_id = current_user.id

    if @review.save
      flash[:success] = "review created!"
      redirect_to root_url
    else
      render 'new'
    end
  end

  def new
    @review = Review.new(params[:review])
    @game = Game.find_by_id(params[:game_id])
    @review.game_id = @game.id
  end

有什么可以被驳回的吗?此外,现在每条评论在我的数据库中都有一个 game_id,但我仍然遇到问题,评论只列在游戏中,其 id 等于用户(作者)id。

示例:我正在尝试评论一个 ID 为 4 的游戏,而我是一个 id=2 的用户...发布时,评论不是显示在游戏编号 4 上,而是显示在 ID 为 2 的游戏上。即使正如在我的数据库中看到的,评论获得了正确的 game_id,但它与游戏无关,但用户 id 是......

我认为必须修改我的游戏控制器中的“显示”方法

目前它看起来像这样

  def show
    #store_location
    @game = Game.find(params[:id])
    @review = @game.reviews.build
    @feed_items = @game.feed.paginate(page: params[:page])
    #@reviews = @user.reviews.paginate(page: params[:page])

    respond_to do |format|
      format.html # show.html.erb
      format.json { render json: @game }
    end

  end
于 2013-04-18T09:43:47.480 回答