开发者

Nested model form not working properly - need to pinpoint POST/GET redirect

I have a nested model form that isn't functioning properly. The POST is to the proper place, but then the GET reroutes me. So I'm wondering if anyone can help explain what I'm doing wrong.

I have two models: User and Profile. Code for them below:

User:

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

Profile:

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

New/Create from both models:

class UsersController < Applica开发者_如何学运维tionController
  def new
    @user = User.new
    if logged_in?
      redirect_to current_user.profile
    end
  end

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

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

  def index
    @profile = current_user.profile
  end

My signup (two step process) mixes the models, so as I said I'm using a nested model form in my Users new.html.erb file. Code form_for and f.fields_for below:

<%= form_for(:user, :url => signup_path, :html => {:id => 'homepage'}) do |f| %>
<%= f.fields_for :profile do |f| %>

Now when I enter data into the form, my routes.rb file seems to POST to the proper place (/signup so profile can be filled out further), but GET routes me to /login.

Routes.rb:

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

In rails server:

Started POST "/signup" for 127.0.0.1 at Sun Aug 28 19:54:11 -0400 2011
  Processing by ProfilesController#new as HTML

Started GET "/login" for 127.0.0.1 at Sun Aug 28 19:54:11 -0400 2011
  Processing by SessionsController#new as HTML
Rendered sessions/new.html.erb within layouts/application (32.1ms)

I'm wondering if the problem is in my layouts/application file, specifically this code:

<% if logged_in? %>
  <%= render 'layouts/header_in' %>
<% else %>
  <%= render 'layouts/header_out' %>
<% end %>

Can anyone help explain to me what I'm doing wrong?

UPDATE:

I deleted the if/else argument in `layouts/application' and it was still redirected. So I'm back to wondering what's going on.


I believe your problem has to do with an inherent issue (though arguably not problem) with HTTP protocol. You cannot return a redirect to a POST request. Alternatives include calling the other method from within the first controller action, or rendering the correct page directly from that action, or some mix of both.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜