Ruby on rails 通过登录持久化表单输入
我有这个应用程序,用户可以为学校写一篇评论。用户必须登录Facebook才能保存评论。问题是,如果一个用户未签名并写了一篇评论,然后登录Facebook,他们必须再次写同样的评论 我试图通过在会话中存储评论数据表单来解决这个问题,但我不能完全让它工作 正确的rails方法是什么 审查形式:Ruby on rails 通过登录持久化表单输入,ruby-on-rails,ruby-on-rails-3,session,Ruby On Rails,Ruby On Rails 3,Session,我有这个应用程序,用户可以为学校写一篇评论。用户必须登录Facebook才能保存评论。问题是,如果一个用户未签名并写了一篇评论,然后登录Facebook,他们必须再次写同样的评论 我试图通过在会话中存储评论数据表单来解决这个问题,但我不能完全让它工作 正确的rails方法是什么 审查形式: <%= form_for [@school, Review.new] do |f| %> <%= f.text_area :content %> <% if curre
<%= form_for [@school, Review.new] do |f| %>
<%= f.text_area :content %>
<% if current_user %>
<%= f.submit 'Save my review', :class => "btn" %>
<% else %>
<%= f.submit 'Save my review and sign me into facebook', :class => "btn" %>
<% end %>
<%end %>
“btn”%>
“btn”%>
查看控制器
class ReviewsController < ApplicationController
before_filter :signed_in_user, only: [:create, :destroy]
def create
@school = School.find(params[:school_id])
@review = @school.reviews.new(params[:review])
@review.user_id = current_user.id
if @review.save
redirect_to @review.school, notice: "Review has been created."
else
render :new
end
end
def new
@school = School.find_by_id(params[:school_id])
@review = Review.new
end
def save_review(school, review, rating)
Review.create(:content => review, :school_id => school,
:user_id => current_user, :rating => rating)
end
private
def signed_in?
!current_user.nil?
end
def signed_in_user
unless signed_in?
# Save review data into sessions
session[:school] = School.find(params[:school_id])
session[:review] = params[:review]
session[:rating] = params[:rating]
# Login the user to facebook
redirect_to "/auth/facebook"
# After login save review data for user
save_review(session[:school], session[:review], session[:rating])
end
end
end
class-ReviewsControllerReview,:school\u id=>school,
:user\u id=>当前用户,:rating=>rating)
结束
私有的
def已登录?
!当前_user.nil?
结束
def已签名用户
除非你签了名?
#将审阅数据保存到会话中
会话[:school]=school.find(参数[:school\u id])
会话[:审阅]=参数[:审阅]
会话[:额定值]=参数[:额定值]
#将用户登录到facebook
将_重定向到“/auth/facebook”
#登录后,为用户保存审核数据
保存复习(课时[:学校]、课时[:复习]、课时[:评分])
结束
结束
结束
我的理解是,除了用户令牌等非常小的东西之外,在会话中存储东西不是“Rails方式”。你可以在Obie Fernandez的Rails 3方式中阅读更多关于这个想法的内容
我建议您从一开始就将评论存储在数据库中,并且只有在评论连接到Facebook认证用户后才“显示”评论。如果你对如何做到这一点有任何好奇,我很乐意详细说明
编辑:下面是一个小示例代码。首先,我负责将用户与评论关联起来,以实现“永久”存储。您可以将用户id
添加到查看
表中,但在大多数情况下它可能是null
,这对我来说似乎很草率:
$ rails g model UserReview review_id:references, user_id:references
然后我将创建一个user\u session\u review
表,其中包含一个review\u id
和一个user\u session\u token
。这是用于“临时”存储:
然后,当用户注册时,将任何“临时”评论与该用户关联:
class User
has_many :user_reviews
has_many :reviews, through: :user_reviews
has_many :user_session_reviews
def associate_reviews_from_token(user_session_token)
temp_reviews = UserSessionReview.find_all_by_user_session_token(user_session_token)
temp_reviews.each do |temp_review|
user_reviews.create!(review_id: temp_review.review_id)
temp_review.destroy
end
end
end
因此,在控制器中,您可以执行以下操作:
class UsersController < ApplicationController
def create
# some stuff
@user.associate_reviews_from_token(cookies[:user_session_token])
end
end
我的理解是,除了像用户令牌等非常小的东西之外,在会话中存储东西不是“Rails方式”。你可以在Obie Fernandez的Rails 3方式中阅读更多关于这个想法的内容 我建议您从一开始就将评论存储在数据库中,并且只有在评论连接到Facebook认证用户后才“显示”评论。如果你对如何做到这一点有任何好奇,我很乐意详细说明 编辑:下面是一个小示例代码。首先,我负责将用户与评论关联起来,以实现“永久”存储。您可以将
用户id
添加到查看
表中,但在大多数情况下它可能是null
,这对我来说似乎很草率:
$ rails g model UserReview review_id:references, user_id:references
然后我将创建一个user\u session\u review
表,其中包含一个review\u id
和一个user\u session\u token
。这是用于“临时”存储:
然后,当用户注册时,将任何“临时”评论与该用户关联:
class User
has_many :user_reviews
has_many :reviews, through: :user_reviews
has_many :user_session_reviews
def associate_reviews_from_token(user_session_token)
temp_reviews = UserSessionReview.find_all_by_user_session_token(user_session_token)
temp_reviews.each do |temp_review|
user_reviews.create!(review_id: temp_review.review_id)
temp_review.destroy
end
end
end
因此,在控制器中,您可以执行以下操作:
class UsersController < ApplicationController
def create
# some stuff
@user.associate_reviews_from_token(cookies[:user_session_token])
end
end
您应该在“创建会话”操作中保存评论(该操作未包含在您的问题中)。假设您使用的是omniauth,您可以在处理回调的操作上添加一些内容
# review controller
def signed_in_user
unless signed_in?
# Save review data into sessions
session[:school] = School.find(params[:school_id])
session[:review] = params[:review]
session[:rating] = params[:rating]
# Login the user to facebook
redirect_to "/auth/facebook"
end
end
# callback to login the user
def handle_callback
# do your thing here to login the user
# once you have the user logged in
if signed_in?
if session[:school] && session[:review] && session[:rating] # or just 1 check
Review.create(
content: session.delete(:review),
school_id: session.delete(:school),
user_id: current_user.id,
rating: session.delete(:rating)
)
#redirect_to somewhere
end
end
end
我使用了delete,因此会话将清除这些值
更新:因为您使用的是会话控制器
class SessionsController < ApplicationController
def create
if user = User.from_omniauth(env["omniauth.auth"])
session[:user_id] = user.id
if session[:school] && session[:review] && session[:rating] # or just 1 check
review = Review.new
review.content = session.delete(:review)
review.school_id = session.delete(:school)
review.user_id = user.id
review.rating = session.delete(:rating)
review.save
end
end
redirect_to :back
end
class sessioncontroller
您应该在“创建会话”操作中保存评论(该操作不包括在您的问题中)。假设您使用的是omniauth,您可以在处理回调的操作上添加一些内容
# review controller
def signed_in_user
unless signed_in?
# Save review data into sessions
session[:school] = School.find(params[:school_id])
session[:review] = params[:review]
session[:rating] = params[:rating]
# Login the user to facebook
redirect_to "/auth/facebook"
end
end
# callback to login the user
def handle_callback
# do your thing here to login the user
# once you have the user logged in
if signed_in?
if session[:school] && session[:review] && session[:rating] # or just 1 check
Review.create(
content: session.delete(:review),
school_id: session.delete(:school),
user_id: current_user.id,
rating: session.delete(:rating)
)
#redirect_to somewhere
end
end
end
我使用了delete,因此会话将清除这些值
更新:因为您使用的是会话控制器
class SessionsController < ApplicationController
def create
if user = User.from_omniauth(env["omniauth.auth"])
session[:user_id] = user.id
if session[:school] && session[:review] && session[:rating] # or just 1 check
review = Review.new
review.content = session.delete(:review)
review.school_id = session.delete(:school)
review.user_id = user.id
review.rating = session.delete(:rating)
review.save
end
end
redirect_to :back
end
class sessioncontroller
为什么不要求用户先登录,然后才能查看“写评论”部分?我考虑过这一点,但这不是一个很好的体验。顺便说一句,您可能想了解更多关于RESTful资源的信息。我在回答中推荐的那本书,Rails 3 Way,