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

此生再无相见时 提交于 2020-01-06 08:37:05

问题


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 < ApplicationController
  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.


回答1:


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.



来源:https://stackoverflow.com/questions/7224881/nested-model-form-not-working-properly-need-to-pinpoint-post-get-redirect

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!