如何使用会话引导用户完成注册?

时间:2015-08-06 16:55:48

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

在主页上:

节/ _goal.html.erb

<%= simple_form_for(:session, url: new_goal_path) do |f| %>
  <%= f.text_field :name %>
  <%= f.submit %>
<% end %>
  # ERROR MESSAGE:
    Routing Error
    No route matches [POST] "/goals/new"

用户提交后,应将其重定向到:

节/ _habit.html.erb

<%= simple_form_for(:session, url: new_habit_path) do |f| %>
  <%= f.text_field :name %>
  <%= f.submit %>
<% end %>

用户提交后,应将其重定向到:

<%= link_to "Sign Up via Facebook", "/auth/facebook" %> or
<%= link_to "Sign Up via Email", signup_path %>

然后应该存储他们放在这两个部分中的信息,这样当他们登录时,他们会将其视为他们个人资料的一部分。

sessions_controller.rb

class SessionsController < ApplicationController

  def new
  end

  def goal
  end 

  def facebook
    user = User.from_omniauth(env["omniauth.auth"])
    session[:user_id] = user.id
    redirect_to root_url
  end

  def create
    user = User.find_by(email: params[:session][:email].downcase)
    if user && user.authenticate(params[:session][:password])
      if user.activated?
        log_in user
        params[:session][:remember_me] == '1' ? remember(user) : forget(user)
        redirect_to root_url
      else
        message  = "Account not activated. "
        message += "Check your email for the activation link."
        flash[:warning] = message
        redirect_to root_url
      end
    else
      flash.now[:danger] = 'Invalid email/password combination'
      render 'new'
    end
  end

  def destroy
    log_out if logged_in?
    redirect_to root_url
  end
end

路由

Rails.application.routes.draw do

  put '/mark_completed/:id', to: 'habits#mark_completed', as: 'mark_completed'

  put '/mark_accomplished/:id', to: 'goals#mark_accomplished', as: 'mark_accomplished'

  get 'notes/index'

  get 'notes/new'

  get 'notifications/index'

  get 'auth/:provider/callback', to: 'sessions#facebook'
  get 'auth/failure', to: redirect('/')
  get 'signout', to: 'sessions#destroy', as: 'signout'

  get 'password_resets/new'

  get 'password_resets/edit'

  get "/users/:user_id/goals", to: "goals#user_goals", as: "user_goals"

  shallow do
    resources :habits do
      resources :comments
      resources :notes
      resources :notifications
    end
    resources :valuations do
      resources :comments
      resources :notes
      resources :notifications
    end
    resources :goals do
      resources :comments
      resources :notes
      resources :notifications
    end
    resources :stats do
      resources :comments
      resources :notes
      resources :notifications
    end
  end

  resources :notes

  resources :habits do
    collection { post :sort }
    resources :notes
    resources :notifications
    resources :comments do
      resources :likes
    end
    resources :likes
    member do
      post :like
      post :notifications
    end
    resources :levels do
      # we'll use this route to increment and decrement the missed days
      resources :days_missed, only: [:create, :destroy]
    end
  end

  resources :goals do
    resources :notes
    resources :comments
    member do
      post :like
    end
  end

  resources :valuations do
    resources :notes
    resources :comments
    resources :notifications
    member do
      post :like
      post :notifications
    end
  end

  resources :stats do
    resources :notes
    resources :comments
    resources :notifications
    member do
      post :like
    end
  end

  resources :results

  resources :users

  resources :account_activations, only: [:edit]

  resources :activities do
    resources :valuations
    resources :habits
    resources :stats
    resources :goals
  end

  resources :notifications do
    resources :valuations
    resources :habits
    resources :stats
    resources :goals
    resources :comments
  end

  resources :comments do
    resources :comments
    resources :notifications
    member do
      post :like
    end
  end

  resources :password_resets,     only: [:new, :create, :edit, :update]

  resources :relationships,       only: [:create, :destroy]

  get 'tags/:tag', to: 'pages#home', as: :tag

  resources :users do
    member do
      get :following, :followers
    end
  end

  get    'about'   => 'pages#about'
  get    'signup'  => 'users#new'
  get    'login'   => 'sessions#new'
  post   'login'   => 'sessions#create'
  delete 'logout'  => 'sessions#destroy'

  root 'pages#home'

我不知道我在这做什么。任何帮助将不胜感激:]

1 个答案:

答案 0 :(得分:1)

这需要一些工作。

首先,修复你的路线(在你理所当然地将它们发布在这里)。

接下来,将您的部分内容更改为操作模板(从名称中删除下划线_)。

然后在您的控制器操作中使用params[...]检索数据(例如第一步的params[:session][:name])并将其保存在sessionsession[:name] = params[:session][:name])中。

在操作结束时调用redirect_to :another_action(将another_action更改为您希望接下来的具体操作 - 例如goal方法redirect_to :habit_url - 您应该添加{控制器的{1}}方法。

然后,在与Facebook相关的方法中,您将拥有habit和其他可用内容,因此您只需从那里获取并推入数据库(session[:name])。

阅读材料

Action Controller Overview - 首先需要仔细阅读

Active Record Basics - 如何将用户详细信息保存到数据库

Rails Routing from the Outside In - 只需仔细研究一下,注意与当前设置相关的地方