如何在会话中存储零用户的目标?

Posted

技术标签:

【中文标题】如何在会话中存储零用户的目标?【英文标题】:How to store nil user's goal in a session? 【发布时间】:2015-11-01 14:52:12 【问题描述】:

如何在用户的会话中保存用户的目标?然后,一旦他注册,保存该目标并将其从会话中删除?

在主页上是这样的:

goals/_form.html.erb

<%= simple_form_for(@goal) do |f| %>
  <%= f.text_field :name %>
  <%= f.text_field :deadline %>
  <%= f.submit %>
<% end %>

点击提交后,nil 用户的目标应该被添加到他的会话中,然后他应该被重定向到注册页面,注册后他的目标应该被添加到他新创建的帐户中。

goals_controller

  def create
    @goal = params[:user] ? current_user.goals.build(goal_params) : Goal.new(goal_params)
    if params[:session][:name][:deadline] 
      session[:name][:deadline] = params[:session][:name][:deadline] 
      redirect_to signup_url 
    elsif 
      @goal.save
      track_activity @goal
      redirect_to @goal, notice: 'Goal was successfully created'
    else
      flash.now[:danger] = 'Required Field: "Enter Goal"'
      render 'new'
    end
  end

现在,如果我以nil 用户身份点击提交,我会得到:

NoMethodError in GoalsController#create
undefined method `[]' for nil:NilClass
for line: if params[:session][:name][:deadline]

然后,一旦他注册了存储在他的会话中的目标,就应该将其添加到他的帐户中。如果最后一个条件太复杂,我可以单独提出一个问题。

【问题讨论】:

你用什么来登录?设计? 创建操作的 nil 错误在哪一行?还有那个 elsif 之后的条件是什么? simple_form_for 的参数结构不会是 params[:goal][:name] 和 params[:goal][:deadline] 吗?*** :session 来自哪里?还是您想查看该会话值是否存在? 【参考方案1】:

目标控制者

  def create
    unless params[:user].present?
        # If there is no user, store the goal values to the session
        session[:goal_name] = goal_params[:name]
        session[:goal_deadline] = goal_params[:deadline]
        redirect_to signup_url
    else
        @goal = current_user.goals.build(goal_params)
        if @goal.save
            track_activity @goal
            redirect_to @goal, notice: 'Goal was successfully created'
        else
            flash.now[:danger] = 'Required Field: "Enter Goal"'
            render 'new'
        end
    end

用户控制器

def create
    # create user logic
    if @user.save
        # Grab the session variable at the same time deleting it
        gName = session.delete(:goal_name)
        gDeadline = session.delete(:goal_deadline)

        # You can make this more complex for error handling
        @user.goals.create(name: gName, deadline: gDeadline)
        redirect_to success_creation_path
    else
      ...
    end
end

【讨论】:

Yw。而不是构建它然后保存它,您可以创建它。我将更改变量名称,以免混淆 再次感谢。非常好:] 嘿@blnc,我在注册过程中添加了一个额外的步骤,要求用户也建立一个习惯,但如果你也愿意帮助我,我遇到了一个问题:] ***.com/questions/31908491/…

以上是关于如何在会话中存储零用户的目标?的主要内容,如果未能解决你的问题,请参考以下文章

Rails:如何在会话中存储数据?

如何在 Spring MVC 中存储会话

如何在pl / sql中同时在不同会话中执行存储过程

如何存储用户的会话数据

Laravel 如何在会话 Laravel 中存储额外的数据/值

Odoo 如何存储会话?