如何允许非用户提交数据并将其保存给新用户?

时间:2015-08-08 19:08:02

标签: ruby-on-rails ruby model-view-controller

以下图片来自我网站的主页。我试图鼓励nil用户从一开始就创建目标。

enter image description here

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

点击提交后,nil用户应成为guest用户,并且应创建目标:

  def create
    @goal = current_user.goals.build(goal_params)
    if @goal.conceal == true
      @goal.save
      redirect_to @goal, notice: 'Goal was successfully created'
    elsif @goal.guest == true
      @goal.save
      redirect_to signup_url, notice: 'Sign up to see your goal!'
    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

然后应将guest用户重定向到注册页面:

<%= form_for(@user) do |f| %>
  <%= f.text_field :name %>
  <%= f.email_field :email %>
  <%= f.password_field :password %>
  <%= f.submit %>
<% end %>

登录后,作为guest用户输入的数据应该已保存并应用于新帐户。

guest用户应在一周内过期:

LIB /目标/ guests.rake

namespace :guests do
  desc "Remove guest accounts more than a week old."
  goal :cleanup => :environment do
    User.where(guest: :true).where("created_at < ?", 1.week.ago).destroy_all
  end
end

user.rb

class User < ActiveRecord::Base
  has_many :goals
  has_secure_password

  def self.new_guest
    new { |u| u.guest = true }
  end

  def move_to(user)
    goals.update_all(user_id: user.id)
  end
end

迁移

rails g migration add_guest_to_users guest:boolean

user_controller

def create
  @user = params[:user] ? User.new(params[:user]) : User.new_guest
  if @user.save
    current_user.move_to(@user) if current_user && current_user.guest?
    session[:user_id] = @user.id
    redirect_to root_url
  else
    render "new"
  end
end

那么我的问题究竟是什么?

  1. 我的思路是否正确或是否有另外一种方法可以实现我的目标?

  2. 点击提交后如何让nil用户成为guest用户?我从post获得了很多灵感,但他的目标与我的目标并不相同。他想让用户免费访问网络应用程序。我只是希望非用户能够提交目标作为注册过程的第一部分。

1 个答案:

答案 0 :(得分:2)

您可以保存没有验证的用户

def create
  @user = params[:user] ? User.new(params[:user]) : User.new_guest
  if @user.save validate: false
    ....
  end
end

这样,当您知道数据不正确时,用户不会返回错误