Рубин на рельсах отношений - PullRequest
0 голосов
/ 05 декабря 2009

Я очень плохо знаком с ruby ​​и программированием в целом. На этапе копирования, вставки и молитвы, как мне нравится это называть. Я пытаюсь ограничить доступ редактора постов и комментариев к создателю, но когда я создаю пост, user_id не заполняется в базе данных.

Заранее спасибо за помощь.

маршруты

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"

пользовательская модель

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

модель вопроса

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

модель ответа

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

enter code here

контроллер вопросов

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

контроллер ответа

  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

Ответы [ 2 ]

0 голосов
/ 05 декабря 2009

Необходимо заполнить вашу модель связанным объектом, чтобы ActiveRecord заполнил внешние ключи. Это проще всего использовать вспомогательный метод. Если вы хотите охватить пользователя:

Выдержка из одного из моих приложений, использующих 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

Тогда вы можете охватить, например, current_user.answers.build или current_user.answers.find(params[:id]

Поскольку ответы принадлежат пользователям и вопросам. Вам нужно будет установить область видимости для любого объекта, который имеет наибольшее значение. Предполагая, что вы решили, что это пользовательский объект, вам нужно будет задать question_id самостоятельно Добавить @answer.question = @question к вашему действию контроллера. Не входите в настройку внешних ключей вручную, например @answer.question_id = @question.id когда ActiveRecord с радостью сделает это за вас.

0 голосов
/ 05 декабря 2009

У вас есть current_user, который аутентифицирован? Если нет, вам нужен один. Я не использовал AuthLogic, но должно быть несколько хороших руководств о том, как это сделать.

Если у вас есть current_user, самое простое решение - сделать что-то вроде:

  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
...