2011-02-16 6 views
0

레일을 처음 사용하기 때문에 추한 코드에주의하십시오. 나는이 게임의 각 단계에서레일 has_many : through 테이블은 저장되지 않습니다.

(등, 승리, 죽음, 현재 단계)이 모델은

class User < ActiveRecord::Base 
has_many :games_playeds 
has_many :games, :through => :games_playeds 

end 

class Game < ActiveRecord::Base 
    has_many :games_playeds 
    has_many :users, :through => :games_playeds 

end 

class GamesPlayed < ActiveRecord::Base 
    validates_presence_of :user_id, :game_id 
    belongs_to :user 
    belongs_to :game 

end 

게임 사용자가 게임에 행동하는 방법 GamesPlayed는 설명 사용자의 독립적 인 게임을 설명 가지고있는 사용자는 몇 가지 선택 중에서 선택할 수 있으며, 일부는 나중 단계로 넘어갈 것이고, 어떤 것은 그를 뒤로 가게 할 것입니다. 요점은 선택이 한 단계에서 이루어지면 다른 것을 선택할 수 없다는 것입니다. 이 구현하려면 "0 : 1, 1 : 6, 6 : 2"등의 이전 선택을 인코딩하는 steps 특성이 있습니다. GamesPlayed 모델의이 속성입니다.

사용자가 탐색하는 페이지는 자동으로 생성되므로 이름은 모르지만 XX_to_YY라고합니다.

 #get the game name, we have several games 
     game = Game.find_by_name (params[:game]) 
     #get the previous and current stage 
     from, to = params[:page].to_s.split("_to_")  
     to = to.split(".html")[0] 

     played = current_user.games_playeds.find_by_game_id (game.id) 

     steps = [] 
     played.steps.split(";").each {|a| steps << a.split(":").first} 
     if steps.include? from 
     render :inline => "You already chose for this, go back" 
     else   
     played.steps << "#{from}:#{to};" 
     played.save 
#  pl = current_user.games_playeds.find_by_game_id (game.id) 
#  raise pl.steps 
     render "games/choosePath/#{game.name}/#{params[:page]}.html" 
     end 

나는 그것이 끔찍한 코드를 추측 :이처럼 추한 뭔가를 그들 모두를 얻을 할 것입니다 내 컨트롤러의 방법이있다. Ruby를 처음 사용합니다. P

이제 질문 : plays.save에서 오류를 제공하지 않습니다.

#  pl = current_user.games_playeds.find_by_game_id (game.id) 
#  raise pl.steps 

올바른 데이터를 "인쇄"하지만 데이터베이스에 저장되지 않습니다! 나는 그것을 시각적으로 검사하기 위해 sqlitebrowser를 사용하고 그것이 저장되지 않았을 것이라고 확신한다.

BTW, 두 번째 질문으로, 누군가가 그 위의 못생긴 코드 없이도 연관 객체에 접근하는 방법을 알고 있다면 매우 감사합니다.

3 및 제 마지막 질문

:

단계 = [] played.steps.split (",") 각각 {| A |. BB, CC :. 이것은 또한 끔찍하지만 더 나은 (AA '에서 AA와 BB를 얻을 할 수 있도록하는 방법을 모른다 첫째}

: < < a.split를 ("") 단계 DD; . "AA와 BB 무엇을 나도 몰라,이 숫자 나 단어가 될 수

답변

1

당신이 save이 실패 할 경우 예외를 발생하려면, save! 전화, 당신은 당신이 반환 된 부울을 확인해야 save를 계속 사용하는 다른 경우 저장 성공 여부를 확인하십시오.

false 반환 값은 유효성 검사에 실패했음을 나타냅니다. 모델에 관한 정보. 당신이 범위로 할 심지어 당신이 뭘 하려는지 캡슐화하는 방법을 작성하여 수있는 일이 아마이 : 더 나은 방법으로 협회보기에 대한


. 단계를 디코딩과 관련하여


, 당신은 inject 대신 each 사용할 수 있지만, 여전히 매우 로직 무거운 것입니다. decode_steps 또는 그와 비슷한 설명이 포함 된 이름으로 메서드에 캡슐화하는 것이 좋습니다.

+0

저장 해봤습니다!하지만 아무런 예외도 발생하지 않습니다. – Jordi

+0

그리고 저장은 "true"를 반환합니다. – Jordi

+0

'played.steps << "# {from} : # {to};"''plays.steps = played.steps + "# {from} : # {to}; "그냥 차이가 있는지 확인하십시오. 또한 레일 콘솔에서이 작업을 다시 시도해 저장이 발생하지 않는 이유에 대해 더 많은 정보를 얻을 수 있는지 확인할 수 있습니다. –

관련 문제