2013-12-08 3 views
0

Установив связь has_many, я пытаюсь выполнить итерацию через связанные объекты B в представлении объекта A. I.e. что-то вродеИтерация через связанные объекты

<% for q in @survey.questions do %> 
    <%= q.name %> <br/> 
<% end %> 

ничего не дает, а

<%= @survey.questions %> 

дает

#<ActiveRecord::Associations::CollectionProxy::ActiveRecord_Associations_CollectionProxy_Question:0x007f9859f221e8> 

Как может (должен) получить доступ к этим?


Вот контроллер

class SurveysController < ApplicationController 
    before_action :set_survey, only: [:show, :edit, :update, :destroy] 


    def index 
    @surveys = Survey.all 
    end 

    def show 
    end 

    def new 
    @survey = Survey.new 
    end 

    def edit 
    end 

    def create 
    @survey = Survey.new(survey_params) 

    respond_to do |format| 
     if @survey.save 
     format.html { redirect_to @survey, notice: 'Survey was successfully created.' } 
     format.json { render action: 'show', status: :created, location: @survey } 
     else 
     format.html { render action: 'new' } 
     format.json { render json: @survey.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    def update 
    respond_to do |format| 
     if @survey.update(survey_params) 
     format.html { redirect_to @survey, notice: 'Survey was successfully updated.' } 
     format.json { head :no_content } 
     else 
     format.html { render action: 'edit' } 
     format.json { render json: @survey.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    def destroy 
    @survey.destroy 
    respond_to do |format| 
     format.html { redirect_to surveys_url } 
     format.json { head :no_content } 
    end 
    end 

    private 
    def set_survey 
     @survey = Survey.find(params[:id]) 
    end 
end 

А вот модели

class Survey < ActiveRecord::Base 
    has_many :assignments 
    has_many :questions, through: :assignments 
end 

.

class Question < ActiveRecord::Base 
    has_many :assignments 
    has_many :surveys, through: :assignments 
end 

.

class Assignment < ActiveRecord::Base 
    belongs_to :survey 
    belongs_to :question 
end 
+0

Можете ли вы добавить свою модель и код контроллера к вопросу? – Powers

+0

Как определяется @survey? – Philip7899

+0

Я обновил свой ответ - дайте мне знать, если это поможет. – Powers

ответ

0

Попробуйте это:

<% @survey.questions.each do |q| %> 
    <%= q.name %> <br/> 
<% end %> 

для цикла следует избегать в Ruby. Из this question, похоже на циклы работают с массивами, так что-то подобное может работать (опять-таки, это не рекомендуется раствор):

<% for q in @survey.questions.to_a do %> 
    <%= q.name %> <br/> 
<% end %> 

Update

Я думаю, что вам нужно сделать ассоциации единственное число в модели Назначения:

class Assignment < ActiveRecord::Base 
    belongs_to :survey 
    belongs_to :question 
end 

Я создал quiz on many to many relationships, что вы могли бы найти полезными.

+0

Все еще ничего не дает. Так оно должно работать так? – jiku

+0

Извините! Это научит меня не копировать все. Они на самом деле были единственными. Обновление сообщения, чтобы отразить его. – jiku

+0

Глядя на ваш гид (спасибо!), Это может быть связано с attr_accessible? То есть мне нужно сделать: имя в классе вопросов доступным? – jiku

0

Насколько я могу судить, ответ Powers должен работать. Попробуйте проверить, действительно ли у @survey есть какие-либо вопросы. Добавить это на свою страницу где-то <%= @survey.questions.count %>

0

У вас действительно есть задание, связанное с этим @survey? Вы можете видеть их на консоли Rails?

Смежные вопросы