views:

120

answers:

2

I am extremely new to ruby and programming in general. In the copy, paste, and pray stage as I like to call it. I am trying to restrict access of editing posts and comments to the creator but when i create a post the user_id isn't populating in the database.

thanks in advance for the help.

routes

map.resources :user_sessions
map.resources :users
map.resources :questions, :has_one => :user, :has_many => :answers
map.login "login", :controller => "user_sessions", :action => "new"
map.logout "logout", :controller => "user_sessions", :action => "destroy"

the user model

   class User < ActiveRecord::Base
   acts_as_authentic
   has_many :questions
   has_many :answers
   end

the question model

class Question < ActiveRecord::Base
  validates_presence_of :question, :tag
  validates_length_of :question, :minimum => 5
  validates_length_of :tag, :minimum =>4
  belongs_to :user
  has_many :answers

end

the answer model

class Answer < ActiveRecord::Base
  belongs_to :question
  belongs_to :user
end

enter code here

the question controller

class QuestionsController < ApplicationController
  before_filter :find_question,
    :only => [:show, :edit, :update, :destroy]
  # GET /questions
  # GET /questions.xml
  def index
    @questions = Question.all

    respond_to do |format|
      format.html # index.html.erb
      format.xml  { render :xml => @questions }
    end
  end

  # GET /questions/1
  # GET /questions/1.xml
  def show

    respond_to do |format|
      format.html # show.html.erb
      format.xml  { render :xml => @question }
    end
  end

  # GET /questions/new
  # GET /questions/new.xml
  def new
    #@question = Question.new
    @user = Question.new
  end

  # GET /questions/1/edit
  def edit

  end

  # POST /questions
  # POST /questions.xml
  def create
    @question = Question.new(params[:question])
    #@question = Question.user.new(params[:question])
      if @question.save
        flash[:notice] = 'Question was successfully created.'
        redirect_to(@question) 
      else
        render :action => "new"
      end
    end
  end

  # PUT /questions/1
  # PUT /questions/1.xml
  def update
      if @question.update_attributes(params[:question])
        flash[:notice] = 'Question was successfully updated.'
        redirect_to(@question)
      else
        render :action => "edit"
      end
  end

  # DELETE /questions/1
  # DELETE /questions/1.xml
  def destroy
    @question.destroy
    redirect_to(questions_url)
  end

  private
    def find_question
      @question = Question.find(params[:id])
    end

answer controller

  class AnswersController < ApplicationController
  def index
    @question = Question.find(params[:question_id])
    @answer = @question.answers
  end

  def show
    @question = Question.find(params[:question_id])
    @answer = @question.answers.find(params[:id])
  end

  def new
     @question = Question.find(params[:question_id])
     #@question = Question
     @answer = @question.answers.build
     #@answer = Answer.new
     #redirect_to questions_url(@answer.question_id)
  end

  def create
     #@question = Question.find(params[:question_id])
    # @question = Question
   @answer = Answer.new(params[:answer])

    if @answer.save
      redirect_to question_url(@answer.question_id)
    else
      render :action => "new"
    end
  end

  def edit
    @question = Question.find(params[:question_id])
    @answer = @question.answers.find(params[:id])
  end

  def update
    @question = Question.find(params[:question_id])
    @answer = Answer.find(params[:id])
    if @answer.update_attributes(params[:answer])
      redirect_to question_answer_url(@question, @answer)
    else
      render :action => "edit"
    end
  end

  def destroy
    @question = Question.find(params[:question_id])
    @answer = Answer.find(params[:id])
    @answer.destroy

    respond_to do |format|
      format.html {redirect_to @question}
      format.xml {head :ok}
    end
  end

end
A: 

Do you have a current_user that is authenticated? If not, you need one. I haven't used AuthLogic but there should be some good tutorials on how to do that.

Assuming you do have a current_user, the easiest solution would be to do something like:

  def create
   @answer = Answer.new(params[:answer])
   @answer.user_id = current_user.id   <--- add this line

    if @answer.save
      redirect_to question_url(@answer.question_id)
    else
      render :action => "new"
    end
  end
lamplighter
You could combine those first two lines into one: `current_user.answers.new(params[:answer])`
Andy Gaskell
thanks for the quick response fellas. I'm focusing on the question portion to start with. I added the current_user.questions.new(params[:question]) in the create method but I am getting the "nil object when you didnt expect it" on nil.save
hollanddd
never mind I got it. Andy your line is what caused the nil.save problem. im using @question before i initialize it.Thanks gents.
hollanddd
A: 

You need to scope your model to the related object for ActiveRecord to populate foreign keys. This is easiest using a helper method. If you wanted to scope to the user:

Excerpted from one of my apps using Authlogic:

class ApplicationController < ActionController::Base

  helper_method :current_user_session, :current_user

  protected

  def current_user_session
    @current_user_session ||= UserSession.find
  end

  def current_user
    @current_user ||= current_user_session && current_user_session.user
  end

end

Then you can scope e.g. current_user.answers.build, or current_user.answers.find(params[:id]

As answers belong to users and questions. You're going to have to set the scope to whichever object makes the most sense. Assuming you decided it's the user object, you'll have to set the question_id yourself Add @answer.question = @question to your controller action. Don't get into setting foreign keys manually e.g. @answer.question_id = @question.id when ActiveRecord will happily do it for you.

Steve Graham