Проблема с процессом регистрации вложенных форм - PullRequest
0 голосов
/ 05 сентября 2011

После исследования SO я обнаружил, что хочу зарегистрироваться:

  1. Пользователь заполняет форму
  2. Пользователь нажимает кнопку «Присоединиться»
  3. Пользователь создан / авторизован и перенаправлен для заполнения профиля
  4. Кнопка нажата
  5. Пользователь направлен на профиль

Если бы я создал пользователя и профиль пользователя в 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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...