将对象的id传递给另一个嵌套对象

时间:2013-04-17 20:06:10

标签: ruby-on-rails ruby object controller

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

为了查看特定游戏,评论对象需要获得游戏的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 %>

但这会引发我的运行时错误: “将id称为nil,这将错误地为4 - 如果你真的想要id为nil,请使用object_id”

我不明白为什么。我的网址看起来像“localhost:3000 / games /:id / reivews / new”,并且在表单中定义,网址获取“@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中设置它?

我感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

我在这里找到两个问题,格式为

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

无需传递@game,只需要:url =&gt; game_reviews_path

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

第二,来自game_id隐藏字段标记

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

你的参数[:game_id] 会给出游戏的ID,但是在你的创建操作中你会这样做

 @game = Game.find_by_id(params[:id])

答案 1 :(得分: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是...

我认为我的游戏控制器中的“show”方法必须进行修改

目前看起来像这样

  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