2009-12-04 147 views
0

我对ruby和一般编程极其新颖。在复制,粘贴和祈祷阶段,我喜欢称它。我试图限制编辑帖子和评论的访问权限给创作者,但是当我创建帖子时user_id没有填充到数据库中。Ruby on rails的关系

在此先感谢您的帮助。

路线

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 

回答

0

您需要范围模型对相关对象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.buildcurrent_user.answers.find(params[:id]

答案属于用户和问题。你将不得不将范围设置为最有意义的对象。假设你决定它是用户对象,那么你必须自己设置question_id将@answer.question = @question添加到你的控制器动作中。不要手动设置外键,例如当ActiveRecord很乐意为你做时。

0

你有一个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 
+0

您可以将前两行合并为一个:'current_user.answers.new(params [:answer])' – 2009-12-04 23:02:28

+0

感谢您的快速反应。我主要关注问题部分。我在create方法中添加了current_user.questions.new(params [:question]),但是我在nil.save – cachesking 2009-12-05 06:01:00

+0

上得到了“没有预期它的零对象”没关系,我知道了。 Andy的线是什么导致了nil.save问题。即时通讯使用@question之前我初始化它。感谢男性。 – cachesking 2009-12-05 06:12:42