2010-02-15 2 views
0

여러 페이지에 배치해야하는 중첩 된 특성이있는 양식이 있습니다. 반드시 그것이 속한 모델 일 필요는 없습니다. 그래서이 양식은 대대 쇼 페이지에 있습니다. 사용자 정보는 잘 작성되었지만 사용자에게는 has_many 역할이 있으며이 속성은 작성되지 않습니다. 나는 잘 작동하는 다른 많은 중첩 된 형태를 가지고 있는데, 나는이 작업을하기 위해 내가 무엇을 놓쳤는지를 정확히 알 수 없다.응용 프로그램 전체에서 여러 페이지에 배치되는 중첩 된 양식

class User < ActiveRecord::Base 
    has_many :roles 
    accepts_nested_attributes_for :roles, :allow_destroy => true 

     def active? 
    active 
end 

def activate!(params) 
    self.active = 1 
    self.login = params[:user][:login] 
    self.password = params[:user][:password] 
    self.password_confirmation = params[:user][:password_confirmation] 
    save 
end 

def deliver_activation_instructions! 
    reset_perishable_token! 
    NotifierMailer.deliver_activation_instructions(self) 
end 

def deliver_activation_confirmation! 
    reset_perishable_token! 
    NotifierMailer.deliver_activation_confirmation(self) 
end 

def has_no_credentials? 
    self.crypted_password.blank? 
end 

def signup!(params) 
    self.login = params[:user][:login] 
    self.email = params[:user][:email] 
    self.name = params[:user][:name] 
    self.position = params[:user][:position] 
    self.battalion_id = params[:user][:battalion_id] 
    self.company_id = params[:user][:company_id] 
    self.platoon_id = params[:user][:platoon_id] 

    save_without_session_maintenance 
end 
end 

class Role < ActiveRecord::Base 
    belongs_to :user 
end 


<% form_for :user, @user, :url => users_path do |f| %> 
     <%= f.error_messages %> 
     <% f.fields_for :roles do |f| %> 
     <%= render :partial => "role", :locals => { :f => f, :role => 'battalion'} %> 
     <% end %> 
     <%= render :partial => "form", :locals => { :f => f, :position => 'Battalion Commander', :company => 'nil'} %> 
     <%= f.submit "Register" %> 
    <% end %> 

_role.html.erb

<%= f.hidden_field(:name, :value => role) %> 

_form.html.erb

<%= f.hidden_field(:position, :value => position) %> 
<%= f.hidden_field(:battalion_id, :value => @battalion.id) %> 
<%= f.hidden_field(:company_id, :value => company) %> 

<%= f.label(:name, "Name:") %> 
<%= f.text_field :name%> 
<br /> 
<%= f.label(:email, "E-Mail:") %> 
<%= f.text_field :email%> 
<br /> 

이 내가 사용자를 만들 때 발생하는 것입니다 :

처리 UsersController 번호 생성 (127.0.0.1 at 2010-02-14 22:15:16) [POST] 매개 변수 : { "user"=> { "name"=> "Chirs", "roles"=> { "name"=> "battalion"}, "company_id"=> "nil", "position"=> "Battalion Commander", "email"=> "[email protected]", "battalion_id"=> "1 "}," "=>"등록 ","행동을 저지 "=>" ","authenticity_token "=>"PcGbsQNG7wKKPDZTM + JGry/a1aBWZuoyaCNwlqlCJ0g = ","컨트롤러 "=>"사용자 "} 단지

I를 만들 역할에 대한 작성 조치를 트리거하지 않습니다.

매우 간단해야합니다. 내 유일한 추측은 문제가되는 사용자 모델에서 벗어났습니다. form_for @battalions이어야하고 사용자 중첩 및 역할 중첩을해야합니다. 즉 3 단계이며 올바르게 보이지 않습니다.

도움을 주시면 감사하겠습니다.

답변

0

accepts_nested_attributes_for를 처리 할 때 "# {association} _attributes"에 할당해야합니다. 귀하의 경우에는 roles_attributes가 필요합니다.

fields_for를 accepts_nested_attributes_for와 함께 사용하면 올바른 HTML이 생성되어야합니다.

보기/부분이 정확하지만 숨겨진 필드가 올바른 입력 ID를 생성하지 않습니다.

문제를 재현 할 수 있었던 유일한 방법은 @user가 nil 일 때입니다. 이 양식을 사용하기 전에 사용자를 초기화하는 것을 잊어 버릴 가능성이 있습니까? 여러 페이지에서 동일한 부분을 사용할 때 간과하는 것은 어려운 일이 아닙니다.

이 양식을 렌더링하는 모든 컨트롤러 작업에서 @user = User.new를 사용하면됩니다.

+0

도움 주셔서 감사합니다. accepts_nested_attributes_for : roles, : allow_destroy => 사용자 모델에서 true이면 충분하지 않습니까? 그것은 응용 프로그램에서 다른 중첩 된 양식에있는 것 같습니다. 어디에서 "# {association} _attributes"를 할당해야합니까? 나는 문제가 사용자와 관련이 있다고 생각하지 않는다. 사용자를 올바르게 만들었 기 때문이다. 단지 연관된 역할이 아니기 때문이다. User 모델에서 똑바로 시도해도 똑같은 문제가 있습니다. Authlogic을 사용하여 새 사용자를 만들고 있는데, 그 사용자와 관련이 있는지 궁금합니다. 그것을보고있어 주셔서 감사합니다. – looloobs

+0

한 가지 더 : 새 사용자를 만들면이 일이 일어납니다. 왜이 "역할"=> "# <역할 : 0x19751ac>"이 여기에 있습니까? 처리 UsersController # create (127.0.0에 해당).1 at 2010-02-15 15:30:52) [POST] 매개 변수 : { "user"=> { "name"=> "John Jones", "roles"=> "# ", "roles_attributes"=> { "0"=> { "name"=> "대대"}}, "company_id"=> "", "login"=> "jjones2", "platoon_id"=> "", "position => "", "email"=> "[email protected]", "battalion_id"=> ""} "커밋"=> "등록", "액션"=> "생성", "authenticity_token"= > "사용자"} – looloobs

+0

사용자를 생성 또는 업데이트하고 roles_attributes에 직접 할당 할 관련 역할을 수정하려는 경우 언제든지 role_attributes에 할당 할 수 있습니다. accepts_nested_attributes_for를 사용하면 fields_for를 사용할 때 자동으로 수행됩니다. 렌더링 된 뷰의 소스를 확인하면 입력 이름에 표시됩니다. – EmFi