2010-12-14 5 views
1

레일을 newb 여기에 있습니다. 내 애플 리케이션에서 각각 중첩 된 특성으로 여러 MameControls 가지고 게임 데이터베이스를 만들려고. New view에는 MameControls를 입력하는 필드가 표시되지만 Edit에는 표시되지 않으며 결과는 Show에 렌더링되지 않으며 validate_presence_of : mameControls 인 경우 "Mame controls can not be empty"라는 양식을 저장하지 않습니다. 그리고 레일 콘솔에서 Game.first (또는 마지막 또는 다른 레코드) .mame_controls는 [] 만 반환합니다. 따라서 중첩 된 속성이 저장되지 않는다고 말할 수있는 한, 레일 스 캐스트 # 196에 표시된 것과 비슷하게 모든 것을 설정 했음에도 불구하고 말입니다.Rails에 중첩 된 속성을 저장할 수 없습니다.

class Game < ActiveRecord::Base 
    has_many :mame_controls, :dependent => :destroy 

    attr_accessible :name, :year, :company, :designer, :genre, 
    :sb_info, :wiki_link, :arcade_history_link, :arcade_museum_link, 
    :caesar_link, :wildcard_link, :mame_controls 

    accepts_nested_attributes_for :mame_controls, :reject_if => lambda { |a| a[:content].blank? }, :allow_destroy => true 

    validates_presence_of :name, :year, :company, :genre, :sb_info, :mame_controls 

end 

mame_control.rb :

class MameControl < ActiveRecord::Base 
    belongs_to :game 

    attr_accessible :name, :game_action 
end 

양식 코드에 입력하거나 편집 MameControls이 여기에 게임의 클래스입니다. _form.html.erb에서

:

<% f.fields_for :mame_controls do |builder| %> 
    <%= render "control_fields", :f => builder %> 
<% end %> 

_control_fields.html.erb :

games_controller.rb에서
<div class="field"> 
<p> 
    <%= f.label :name, "Mame Control Name" %><br /> 
    <%= f.text_field :name %><br /> 
    <%= f.label :game_action, "Game Action" %><br /> 
    <%= f.text_field :game_action %> 
</p> 
</div> 

:

def new 
    @game = Game.new 
    5.times do 
     mame_control = @game.mame_controls.build 
    end 
    end 

def create 
    @game = Game.new(params[:game]) 
end 

답변

1

괜찮으 시다면 reject_if을 사용하는 데 몇 가지 문제가있는 것으로 나타났습니다. accepts_nested_attributes_for에 있습니다. 우선, 나는 잘못된 변수 이름 (당혹 스럽네요)을 확인하고 있었고 그 방법이 실제로하고있는 일을 오해했거나 오히려하지 않았습니다. 이전에 채워진 항목이 공백으로 (그 람다 에서처럼) 거부되면, 배열의 해당 인덱스 값을 삭제하거나 null로 지정합니다. 단지 아무 것도하지 않을 것입니다. 소멸하려면 내포 된 속성 레코드를 명시 적으로 _destroy으로 설정해야합니다. 나는 이론적 견지에서 accepts_nested_attributes_for에 대해 읽었지만 그 옵션을 더 잘 이해해야했습니다.

0

시도하십시오 :mame_controls_attributesattr_accessible 및 추가 기록 작성. 그런 다음 레코드를 편집하면 편집보기에 mame_controls의 필드도 표시되어야합니다.

또한 컨트롤이 표시 작업에서 표시되어야하는 이유는 무엇입니까? (쇼는 데이터를 표시하는 것이지 편집하는 것이 아닙니다)

+0

고마워요.하지만 attr_accessible에 대한 mame_controls_attributes가 아무런 차이가 없습니다. 그리고 컨트롤이 쇼 동작에 있지 않으므로 걱정하지 마십시오. 내 말은 단순히 데이터가 정적 정보로 표시되지 않는다는 것입니다. 죄송합니다. 원래 게시물을 수정했습니다. – user541269

0

비슷한 문제가 발생했습니다. 중첩 된 양식을 올바르게 표시 할 수 있지만 양식을 제출할 때 부모 개체 정보를 데이터베이스에 썼지 만 자식 (중첩 된) 개체는 아닙니다.

games_controller.rb

def create 
    @game = Game.new(params[:game]) 
    if @game.save 
    @game.mame_control = MameControl.new(params[:mame_control]) 
    ... 

의 방법을 만들 (나는 당신의 예제를 사용하는 것처럼) 또한 내 부모 개체가 가진 has_one 관계를 가지고 있음을 유의하시기 바랍니다가 내 다음 코드를 추가했다위한 솔루션 아이, has_many 아닙니다.