После исследования SO я обнаружил, что хочу зарегистрироваться:
- Пользователь заполняет форму
- Пользователь нажимает кнопку «Присоединиться»
- Пользователь создан / авторизован и перенаправлен для заполнения профиля
- Кнопка нажата
- Пользователь направлен на профиль
Если бы я создал пользователя и профиль пользователя в rails console
, это выглядело бы так:
user = User.new
user.email = ""
user.password = ""
user.profile = Profile.new
user.profile.info = ""
user.profile.save
user.save
ПРОБЛЕМА: Я использую форму вложенной модели на домашней странице, чтобы создать пользователя и добавить в него имя / фамилию этого пользователя. Что происходит сейчас: пользователь нажимает «Присоединиться», они перенаправляются в / users, затем перенаправляются в / signup. Вот где я застрял. Это дает мне следующую ошибку:
Action Controller: Exception caught
NoMethodError in ProfilesController#new
undefined method `profile=' for nil:NilClass
app/controllers/profiles_controller.rb:5:in `new'
Я хочу, чтобы / регистрация была формой для заполнения профиля, но она не работает.
Мой код ниже ...
Users # new.html.erb (форма домашней страницы):
<%= form_for(@user, :html => {:multipart => true, :id => 'homesign'}) do |f| %>
<%= f.hidden_field :id %>
<% if @user.errors.any? %>
<% end %>
<div>
<%= f.label :email %>
<%= f.text_field :email, :size => 38 %>
</div>
...
<%= f.fields_for :profile do |profile| %>
<%= profile.label :first_name %>
<%= profile.text_field :first_name, :size => 18 %>
...
<% end %>
<% end %>
Profiles # new.html.erb (форма регистрации):
<%= form_for @profile, :html => { :multipart => true } do |f| %>
<table id="signupTable">
<tbody>
<tr>
<td class="label"><%= f.label :gender, "Gender:" %></td>
<td>
<fieldset>
<%= select(:gender, :gender_type, [['Female', 1], ['Male', 2], ['Rather not say', 3]], :class => 'optionText') %>
</fieldset>
</td>
</tr>
<tr>
<td class="label"><%= f.label :birthday, "Birthday:" %></td>
<td>
<fieldset>
<%= select_month(14, :prompt => 'Month', :field_name => 'Month', :id => 'Date.mon') %>
<%= select_day(32, :prompt => 'Day') %>
<%= select_year(0, {:prompt => "Year", :start_year => DateTime.now.year, :end_year => DateTime.now.year - 115}, {:field_name => 'Year', :id => 'Date.year'}) %>
</fieldset>
<% end %>
User.rb:
class User < ActiveRecord::Base
attr_accessor :password
has_one :profile, :dependent => :destroy
accepts_nested_attributes_for :profile
validates :email, :uniqueness => true,
:length => { :within => 5..50 },
:format => { :with => /^[^@][\w.-]+@[\w.-]+[.][a-z]{2,4}$/i }
validates :password, :confirmation => true,
:length => { :within => 4..20 },
:presence => true,
:if => :password_required?
end
Profile.rb:
class Profile < ActiveRecord::Base
belongs_to :user
accepts_nested_attributes_for :user
end
UsersController:
class UsersController < ApplicationController
before_filter :authenticate, :only => [:edit, :update]
def new
@user = User.new
@user.profile = Profile.new
if logged_in?
redirect_to current_user.profile
end
end
def index
@user = User.all
end
def create
@user = User.new(params[:user])
if @user.save
session[:user_id] = user.id
redirect_to new_user_profile_path(:user_id => @user), :notice => 'User successfully added.'
else
render :action => 'new'
end
end
end
ProfilesController:
class ProfilesController < ApplicationController
before_filter :authenticate, :only => [:edit, :update]
def new
@user.profile = Profile.new
end
def create
@profile = Profile.new(params[:profile])
if @profile.save
redirect_to profile_path(@profile), :notice => 'User successfully added.'
else
render :action => 'new'
end
end
def index
@profile = current_user.profile
end
end
SessionsController (только создание):
class SessionsController < ApplicationController
def create
if user = User.authenticate(params[:email], params[:password])
session[:user_id] = user.id
redirect_to user.profile, :notice => "Logged in successfully"
else
flash.now[:alert] = "Invalid login/password. Try again!"
render :action => 'new'
end
end
end
routes.rb:
match "/signup" => "profiles#new", :as => "signup"
post "/profiles/new" => "profiles#create"
match "skip/signup", :to => "info#signupskip"
match "skip/profiles/new", :to => "profiles#newskip"
get "/profiles/:id" => "profiles#show", :as => "profile"
get "profiles/new"
root :to => "users#new"