我有这个表单,用户输入评论。用户必须使用Facebook签名才能保存评论。
我使用before_filter
检查用户是否已登录。
但我收到此错误:undefined local variable or method signed_in_user'
。
另一件事是,我如何使用Facebook登录用户并保存其评论?不会丢失并使用户再次输入相同的评论。
审核表单
<%= 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 %>
ReviewsController
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
end
ReviewsHelper
module ReviewsHelper
def signed_in?
!current_user.nil?
end
def signed_in_user
unless signed_in?
redirect_to "/auth/facebook"
end
end
end
我正在使用omniauth来验证来自Facebook的用户。
答案 0 :(得分:2)
include
你的ReviewsHelper
在控制器中:
class ReviewsController < ApplicationController
include ReviewsHelper #or helper :reviews
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
end
答案 1 :(得分:1)
默认情况下,您的助手不包含在控制器中。
您可以将其包含在代码建议中。
大多数人将他们之前的过滤器作为私有方法放在ApplicationController中。
编辑:
要保留登录,请将其保存到会话数据中。在Rails指南中查找会话。
答案 2 :(得分:0)
我之前遇到过同样的问题。帮助程序是帮助编辑视图层。默认情况下,before_filter方法不能写入助手,除非你在控制器中写'include BlbalblaHelper'。
您可以将application_controller.rb中的before_filter方法作为私有方法或lib /文件夹编写。我认为它们都是DRY更好的方法。