如何在Rails控制器中更新另一个模型的属性

时间:2018-04-07 13:52:05

标签: ruby-on-rails associations nested-attributes nested-routes

我是在Rails 5中创建国际象棋应用程序的团队的一员。我有一个名为“chess_pieces.rb”的控制器。在那里,我有以下代码:

  def update
    @piece = ChessPiece.find(params[:id])
    @game = Game.find_by_id(@piece.game_id)
    @move = @piece.moves.all

    @piece.update_attributes(pieces_params)
    if @piece.valid?
     redirect_to game_path(@game)
    else
      render :edit, status: :unprocessable_entity
    end
    update_moves
  end

  def update_moves
    puts "The piece has been updated!"
    @piece = ChessPiece.find(params[:id])
    @piece.moves.update(count: 19991)
    @piece.save
    puts @piece.moves.count
  end

正如您所见,update方法是在移动时更新一块,特别是棋盘上的x_position和y_position。现在,如何使方法update_moves更新与chess_piece.rb模型关联的名为moves的表的属性。我在电路板上的一个位置更新后,在update方法中调用此方法。

我想更新这件作品的动作次数+其他一些东西。

我的路线如下:

Rails.application.routes.draw do
  devise_for :users
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
  root 'games#home'
  resources :games do
    resources :pieces, only: [:show, :update]
    patch 'update_moves', on: :member
  end


end

1 个答案:

答案 0 :(得分:0)

关系是(件has_many移动)?

如果是这样,我认为你不能用@piece.moves.update(count: 19991)更新一件作品的所有动作。您应该使用迭代或地图单独更新它们。

注意:如果您尝试向该片段添加新的移动记录,则应使用@piece.moves.build(count: 19991)

如果关系是一对一,那么您应该尝试将@piece.moves.update(count: 19991)替换为@piece.moves.count = 19991