通过在Rails中登录/注册来保留表单提交

时间:2009-10-14 06:15:42

标签: ruby-on-rails

假设我在Rails中有这样的网站(通用Q& A网站),我希望这个带有文本框的“询问”页面成为用户看到的第一页,即使他没有登录。他进入一个问题,在'新'方法上,我检查他没有登录,并将他退回到/ session / new,在那里他可以登录或创建一个新帐户。问题是,我如何(以及最好的方法)保留他最初通过这个过程提出的问题?

3 个答案:

答案 0 :(得分:1)

我理解问题中描述的行动流程

  1. 向用户显示表单
  2. 用户被重定向到提交页面上的登录页面
  3. 用户在成功登录后重定向回到表单
  4. 在加载时重新填充表单(问题如何执行此步骤)
  5. 用户最终提交表单。
  6. 如果用户已登录,则省略步骤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]操作。