On 6 April 2012 20:25, Vikram Anand <animated.vik...@gmail.com> wrote: > For some reason (most likely in my view due to naming conventions) rails > association is not working. Trying to access child object from parent object > gives undefined method. > > ...
> Sns::Application.routes.draw do > root :to => "questions#index" > resources :questions do > resources :question_responses > end > > > question.rb: > > class Question < ActiveRecord::Base > validates :title, :presence => true > validates :description, :presence => true > > has_many :question_responses, :dependent => :destroy, :class_name => > "QuestionResponse" > accepts_nested_attributes_for :question_responses, :allow_destroy => true > end > > > question_response.rb: > > class QuestionResponse < ActiveRecord::Base > validates :body, :presence => true > belongs_to :question, :foreign_key => "question_id" > end > > > questions_controller.rb: > > class QuestionsController < ApplicationController > before_filter :find_question > before_filter :find_question_response, :only => [:show, :edit, :update, > :destroy] > > def index > @question = Question.new > @questions = Question.all > end > > def new > @question = Question.new > @question_response = @question.question_responses.build > end > > def create > @question = Question.new(params[:question]) > > if @question.save > flash[:notice] = "Question has been created." > redirect_to @question > else > flash[:alert] = "Question has not been created." > render :action => 'new' > end > > @question_response = > @question.question_responses.build(params[:question_response]) > if @question_response.save > flash[:notice] = "Reply has been created." > redirect_to [@question, @question_response] > else > flash[:alert] = "Reply has not been created." > render "question_responses/new" > end > end > > def show > @question = Question.find(params[:id]) > end > > def edit > @question = Question.find(params[:id]) > end > > def update > @question = Question.find(params[:id]) > > if @question.update_attributes(params[:question]) > flash[:notice] = "Question has been updated." > redirect_to @question > else > flash[:alert] = "Question has not been updated." > render :action => 'edit' > end > end > > def destroy > @question = Question.find(params[:id]) > @question.destroy > flash[:notice] = "Question has been deleted." > redirect_to questions_path > end > > def find_question_response > @question_response = @question.question_responses.find(params[:id]) > end > > private > def find_question > if (params[:question_response] && > params[:question_response][:question_id]) > @question = Question.find(params[:question_response][:question_id]) > elsif params[:question_id] > @question = Question.find(params[:question_id]) > end > end > end > > > Error with trace: > > undefined method `question_responses' for nil:NilClass > > app/controllers/questions_controller.rb:55:in `find_question_response' Read the error carefully, it says that nil has not got a method question_responses, so the object you are trying to call the method on is nil. So apparently @question is nil, assuming that line 55 is @question_response = @question.question_responses.find(params[:id]) The reason is that this is being called in a before_filter and you have not got any code there to setup @question. Colin -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk@googlegroups.com. To unsubscribe from this group, send email to rubyonrails-talk+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.