2014-03-07 3 views
0

간단한 Rails4 응용 프로그램을 만들려고합니다. 나는 가지고있다 사용자 Devise GEM, 시험 모형 및 에 의해 생성되는 모형 참가 모형은 발판 발전기에 의해 생성된다. 나는 사용자가 시험에 등록 할 수 있도록 구조를 만들고 싶습니다 지금중첩 된 경로 및 많은 관계가있는 양식

class Examination < ActiveRecord::Base 
    has_many :participations 
    has_many :users, :through => :participations 
end 

class Participation < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :examination 
end 

class User < ActiveRecord::Base 
    has_many :participations 
    has_many :examinations, :through => :participations 
end 

:

이들은

내 모델입니다. 인덱스 페이지 시험 (app/views/examinations/index.html.erb) 각 시험의 기본 표시, 편집 및 삭제 버튼 바로 옆에 '등록'버튼을 추가하고 싶습니다. 사용자가 "시험 등록" 버튼을 클릭하면 시험 언어 우선 설정을 선택한 다음 등록을 제출할 수있는 페이지를보고 싶습니다.

또한 사용자가 시험에 한 번만 등록 할 수 있기를 원합니다. 그들은 많은 시험에 등록 할 수 있지만 각 시험마다 1 회만 등록 할 수 있어야합니다.

어떻게 이런 종류의 구조를 만들 수 있습니까? 중첩 된 리소스를 사용할 때 모든 양식에서 오류가 발생합니다.

답변

1

양식에 중첩 된 리소스가 필요한 이유가 표시되지 않습니다. 시험 ID와 언어 환경 설정 모두 참여의 속성이어야합니다.

시험 ID를 기반으로 새로운 참여를 만들기 위해 페이지를 만들어야합니다. 참여 • 컨트롤러

# if your route is /participations/new?examination_id=1 
# you could also do nested routing like /exams/1/participations/new 
def new 
    @participation = Participation.new 
    @examination = params[:examination_id] 
end 

def create 
    @participation = Participation.new params[:participation] 
    @participation.user = current_user 
    if @participation.save 
     redirect_to examinations_page 
    else 
     render 'new' 
    end 
end 

그리고는 new.html.erb 페이지에서 단순한 형태의에서

..

<h1> Sign up for: <%= @examination.name %> </h1> 
<%= form_for @participation do |f| %> 
    <%= f.hidden :examination_id %> 
    <%= f.select :language_preference #add the set of language options in here %> 
    <%= f.submit :register %> 
<% end %> 

당신이 당신의 양식을 발견하면 잘못된 경로에 제출한다 , URL을 설정할 수 있습니다 .. 예를 들어 시험 자원에 중첩 된 참여 리소스가있는 경우 대략적인 경로는 다음과 같습니다.

<%= form_for @participation, as: :participation, url: new_examination_participation_path(@examination) } do |f| %> 
    ... 
<% end %> 
+0

** 양식 : ** <% = form_for @participation, : : 참여, url : new_examination_participation_path (@participation, @examination) do | f | %> <% = f.hidden : examination_id %> <% = f.select : language_preference, options_for_select ([ "A", "B"]) %> <% = f.submit : 등록 %> <% end %> ' ** 오류 : ** 'ActionController :: UrlGenerationError in Participations # new 일치하는 경로가 없습니다 : : action => "new", : controller => "participations", : examination_id => # <참여 ID : nil, user_id : nil, examination_id : nil, language_preference : nil} 필수 키 누락 : [: examination_id] ' – msdundar

+0

죄송합니다. 일찍 생각하지 않았습니다. 그냥 new_examination_participation_path (@examination)이어야합니다. 나는 "시험"보다는 짧은 "시험"을 사용하여 내 대답을 썼으며 잘못된 경로를 작성했습니다 – jay

+0

@msdundar 당신은 여전히 ​​같은 오류를 얻고 있습니까? 아니면 업데이트 된 답변이 도움이됩니까? – jay