我对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
答案 0 :(得分: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
答案 1 :(得分: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.build
或current_user.answers.find(params[:id]
答案属于用户和问题。您将不得不将范围设置为最有意义的对象。假设您确定它是用户对象,您必须自己设置question_id将@answer.question = @question
添加到控制器操作中。不要手动设置外键,例如@answer.question_id = @question.id
当ActiveRecord乐意为你做这件事时。