Cómo hacer que los formularios anidados funcionen en diferentes controladores

Soy nuevo en programación y Rails, y estoy trabajando en el proceso de registro para una aplicación en la que estoy trabajando. tengo ambos user y profile modelos. Como parte del proceso de registro, estoy mezclando campos para ambos user y profile, entonces estoy usando formularios anidados.

Estoy tratando de que los formularios anidados funcionen en un controlador que maneja mis páginas estáticas, porque quiero iniciar el proceso de registro en la página de inicio.

El proceso de registro se puede iniciar de dos maneras: directamente desde la página de inicio o se puede omitir en la página de inicio e iniciar en una vista de / signup / skip.

Mi InfoController (donde el home.html.erb archivo con el formulario existe):

def home
  if logged_in?
    redirect_to current_user.profile
  end
end

Forma anidada en home.html.erb:

<%= form_for(:profile, :url => 'signup', :html => {:id => 'homepage'}) do |f| %>
  <p class="hometext">I'm&nbsp;</p>
  <div>
    <%= f.label :first_name, :placeholder => 'First name' %>
    <%= f.text_field :first_name, :size=> 8, :id => "profile[first_name]" %>
  </div>
  <div>
    <label for="profile[last_name]">Last name</label>
    <%= f.text_field :last_name, :size=> 8, :id => "profile[last_name]" %>
  </div>
  <%= f.fields_for :user do |f| %>
  <p class="hometext">.&nbsp;My&nbsp;email&nbsp;is&nbsp;
    <div>
      <label for="user[email]">Email</label>
      <%= f.text_field :email, :size=> 13, :id => "user[email]" %>
    </div>
  <% end %>
  <p class="hometext">.&nbsp;I want to&nbsp;</p>
  <div>
    <label for="user[stat]">put stat here</label>
    <%= f.text_field :stat, :size=> 13, :id => "user[stat]" %>
  </div>
  <p class="hometext">when I grow up.&nbsp;</p>
  <div id="button">
    <%= submit_tag 'Join', :class => 'button orange' %>
  </div>
<% end %>

Modelo de perfil:

class Profile < ActiveRecord::Base
  attr_accessible :first_name, :last_name ...
  belongs_to :user
  accepts_nested_attributes_for :user
end

Modelo de usuario:

class User < ActiveRecord::Base
  attr_accessor :password, :email
  accepts_nested_attributes_for :profile
  has_one :profile, :dependent => :destroy
end

Por alguna razón, cuando ingreso datos en el formulario, se me redirige a / login, que está en Routes.rb as Sessions#new. Así que aquí está 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

Y por último, pero no menos importante, el ProfilesController:

class ProfilesController < ApplicationController
  def new
    @profile = Profile.new
  end

  def create
    @profile = Profile.new(params[:profile])
    if @profile.save
      redirect_to profile_path, :notice => 'User successfully added.'
    else
      render :action => 'new'
    end
  end

Desde el servidor:

Started POST "/signup" for 127.0.0.1 at Sat Aug 27 10:36:50 -0400 2011
DEPRECATION WARNING: You are using the old router DSL which will be removed in Rails     3.1. Please check how to update your routes file at:     http://www.engineyard.com/blog/2010/the-lowdown-on-routes-in-rails-3/. (called from /Users/me/Desktop/app/config/routes.rb:1)
  Processing by ProfilesController#new as HTML
  Parameters: {"commit"=>"Join", "profile"=>{"last_name"=>"...", "user"=>  {"test"=>"...", "email"=>"..."}, "first_name"=>"..."}, "authenticity_token"=>"u82Jom5PV+5BeTLZ5qQENxQiY1lcyFiXR4aNC7NR+5g=", "utf8"=>"\342\234\223"}
Redirected to http://localhost:3000/login 
Completed 302 Found in 35ms


Started GET "/login" for 127.0.0.1 at Sat Aug 27 10:36:51 -0400 2011
  Processing by SessionsController#new as HTML
Rendered layouts/_header_out.html.erb (0.5ms)
Rendered layouts/_footer.html.erb (2.2ms)
Rendered sessions/new.html.erb within layouts/application (32.1ms)
Completed 200 OK in 40ms (Views: 39.0ms | ActiveRecord: 0.0ms)

Actualización: archivo de rutas (las partes relevantes al menos) a continuación:

match '/login' => "sessions#new", :as => "login"
match '/signup', :to => 'profiles#new'
match 'skip/signup', :to => 'info#signupskip'
match 'skip/profiles/new', :to => 'profiles#newskip'
root :to => 'info#home'
resources :users
resources :profiles
resources :info

¿Alguien puede ayudarme a resolver esto? Se agradecería cualquier recomendación sobre cómo hacerlo funcionar y hacerlo de acuerdo con las mejores prácticas.

preguntado el 27 de agosto de 11 a las 14:08

1 Respuestas

¿Puedes publicar tu route.rb?

Además, ¿ha mirado a Devise para esto? Parece que intentas reinventar la rueda.

Echale un vistazo..

http://railscasts.com/episodes/209-introducing-devise

Respondido 27 ago 11, 19:08

Puse las partes relevantes de Routes.rb en la pregunta. ¡No he comprobado Devise, pero lo haré! Gracias. - tvalent2

Devise se ve bien, pero tengo curiosidad por saber cómo hacer que las cosas funcionen sin él. ¡Cualquier idea sería apreciada! - tvalent2

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.