假设我在Rails中有这样的网站(通用Q& A网站),我希望这个带有文本框的“询问”页面成为用户看到的第一页,即使他没有登录。他进入一个问题,在'新'方法上,我检查他没有登录,并将他退回到/ session / new,在那里他可以登录或创建一个新帐户。问题是,我如何(以及最好的方法)保留他最初通过这个过程提出的问题?
答案 0 :(得分:1)
我理解问题中描述的行动流程
如果用户已登录,则省略步骤2-4。
对不起,但我认为您的问题更多是基础UI问题的症状,而不是铁轨问题。
如果只有登录用户可以发帖提问,那么为什么要显示文本框? 如果用户要以任何方式登录,为什么不首先将其取消。更好的解决方案是集成登录和表单。
视图中的内容如下:
<% form_for :question do |form| %>
<% unless logged_in? %>
<% fields_for :session do |session_form|%>
<%= session_form.label :login %>
<%= session_form.text_field :login %>
<%= session_form.label :password %>
<%= session_form.password_field :password %>
<%end%>
<%end%>
<%= form.text_area :question %>
<%end%>
在控制器中
def new
...
unless params[:session].nil?
self.current_user = User.authenticate(params[:session][:login], params[:session][:password])
end
if logged_in?
flash[:notice] = "Logged in successfully"
else
flash[:error] = "Incorrect username and or password."
end
if logged_in? && @question.save
.... process successful entry
else
... process unsuccessful entry
end
end
编辑:Mohamad提出了在多个控制器和表单中重复使用此模式的问题。所以答案已经更新,以解决这种模式的重用问题。
为了简化重用,您可以将此块放在before_filter中为需要它的操作引用的辅助函数中。
def login
unless params[:session].nil?
self.current_user = User.authenticate(params[:session][:login], params[:session][:password])
if logged_in?
flash[:notice] = "Logged in successfully"
else
flash[:error] = "Incorrect username and or password."
end
end
end
如:
before_filter :login => :only [:new , :edit, :update, :delete]
在视图方面,构建嵌入会话参数的form_for的新变体应该不会太难。也许是form_for_with_session?
至于处理不成功的响应,我建议使用一个代码块的辅助函数。对不起,我没有时间为你写出或测试一个。
答案 1 :(得分:0)
你把它留在会话中。因此,在登录后,当用户回去询问他的问题时,您会发现会话中已经存在某些内容 你可以直接显示它。
答案 2 :(得分:0)
def create
if current_user # Implement this method in your auth framework
@question = Question.new(params[:question] || session.delete[:question])
# (the usual stuff you'd do to save)
else
session[:question] = params[:question]
redirect_to :controller => :sessions, :action => "new"
end
end
然后,在您的登录操作中完成用户创建和身份验证之后,如果create
已定义,请务必回复此session[:question]
操作。