Проблема редактирования / заполнения формы для вновь созданного профиля - PullRequest
1 голос
/ 06 сентября 2011

Я почти закончил процесс регистрации, где:

  • (Шаг 1) Новый пользователь заполняет небольшую форму, создавая и пользователя, и профиль
  • (Шаг2) Новый пользователь перенаправляется в ProfilesController для заполнения остальной части профиля
  • (Шаг 3) Новый пользователь завершает профиль и перенаправляется в свой профиль

Пока что-то не такработает правильно.Я считаю, что я сделал так, чтобы профиль был создан в обоих шагах 1 и 2 выше.(Вроде как этот пост , но мои методы отличаются.)

Может кто-нибудь помочь мне исправить это?

Вот мой код.

ProfilesController:

def new
  @profile = Profile.new(params[:profile])
end

def show
  @user = User.find(params[:id])
  @profile = @user.profile
  @superlative = @profile.superlatives.new
end

def edit
  @profile = user.profile
end

UsersController:

def new
  @user = User.new
  @user.profile = Profile.new
  if logged_in?
    redirect_to current_user.profile
  end
end

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

def edit
  @user = current_user
end

def update
  @user = current_user
  if @user.update_attributes(params[:email])
    redirect_to profile_path
  else
    render :action => 'edit'
  end
end

Routes.rb:

match "/signup" => "profiles#edit", :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"
resources :users do
  resources :profiles
end

Форма № 1 (пользователи # новая форма):

<%= form_for(@user, :html => {:multipart => true, :id => 'homesign'}) do |f| %>
<%= f.hidden_field :id %>
  <%= f.label :email %>
  <%= f.text_field :email, :size => 38 %>
<%= f.fields_for :profile do |profile| %>
  <div id="name">
    <%= profile.label :first_name %>
    <%= profile.text_field :first_name, :size => 18 %>
  </div>
<% end %>

Форма № 2 (профили # новые) форма:

<%= form_for '@user.profile', :html => { :multipart => true } do |f| %>
  <%= f.hidden_field :id %>
    <table id="signupTable">
      <tbody>
        <tr>
          <td class="label"><%= f.label :gender, "Gender:" %></td>
        </tr>
      <tbody>
    </table>
<% end %>

Если я использую вышеуказанное, я получаю "Не удалось найти пользователя с идентификатором = xx "

Если я изменю вышеуказанный маршрут с:

match "/signup" => "profiles#new", :as => "signup"

На:

match "/signup" => "profiles#edit", :as => "signup"

Я получу" Не могунайти пользователя без идентификатора "

С rake routes:

profiles_show GET    /profiles/show(.:format)  {:action=>"show", :controller=>"profiles"}
profile GET    /profiles/:id(.:format)  {:action=>"show", :controller=>"profiles"}
profiles_new GET    /profiles/new(.:format)  {:action=>"new", :controller=>"profiles"}
POST   /profiles/new(.:format)  {:action=>"create", :controller=>"profiles"}
profile GET    /profiles/:id(.:format)  {:action=>"show", :controller=>"profiles"}

user_profiles GET    /users/:user_id/profiles(.:format)  {:action=>"index", :controller=>"profiles"}
POST   /users/:user_id/profiles(.:format)  {:action=>"create", :controller=>"profiles"}
new_user_profile GET    /users/:user_id/profiles/new(.:format)  {:action=>"new", :controller=>"profiles"}
edit_user_profile GET    /users/:user_id/profiles/:id/edit(.:format)  {:action=>"edit", :controller=>"profiles"}
user_profile GET    /users/:user_id/profiles/:id(.:format)  {:action=>"show", :controller=>"profiles"}
PUT    /users/:user_id/profiles/:id(.:format)  {:action=>"update", :controller=>"profiles"}
DELETE /users/:user_id/profiles/:id(.:format)  {:action=>"destroy", :controller=>"profiles"}
users GET    /users(.:format)  {:action=>"index", :controller=>"users"}
POST   /users(.:format)  {:action=>"create", :controller=>"users"}
new_user GET    /users/new(.:format)  {:action=>"new", :controller=>"users"}
edit_user GET    /users/:id/edit(.:format)  {:action=>"edit", :controller=>"users"}
user GET    /users/:id(.:format)  {:action=>"show", :controller=>"users"}
PUT    /users/:id(.:format)  {:action=>"update", :controller=>"users"}
DELETE /users/:id(.:format)  {:action=>"destroy", :controller=>"users"}

У меня также есть следующие маршруты для регистрации:

signup_index GET    /signup(.:format)  {:action=>"index", :controller=>"signup"}
POST   /signup(.:format)  {:action=>"create", :controller=>"signup"}
new_signup GET    /signup/new(.:format)  {:action=>"new", :controller=>"signup"}
edit_signup GET    /signup/:id/edit(.:format)  {:action=>"edit", :controller=>"signup"}
GET    /signup/:id(.:format)  {:action=>"show", :controller=>"signup"}
PUT    /signup/:id(.:format)  {:action=>"update", :controller=>"signup"}
DELETE /signup/:id(.:format)  {:action=>"destroy", :controller=>"signup"}

ОБНОВЛЕНИЕ: rake routes только с resources: users, resources :profiles и root.

users GET    /users(.:format)  {:action=>"index", :controller=>"users"}
POST   /users(.:format)  {:action=>"create", :controller=>"users"}
new_user GET    /users/new(.:format)  {:action=>"new", :controller=>"users"}
edit_user GET    /users/:id/edit(.:format)  {:action=>"edit", :controller=>"users"}
user GET    /users/:id(.:format)  {:action=>"show", :controller=>"users"}
PUT    /users/:id(.:format)  {:action=>"update", :controller=>"users"}
DELETE /users/:id(.:format)  {:action=>"destroy", :controller=>"users"}
profiles GET    /profiles(.:format)  {:action=>"index", :controller=>"profiles"}
POST   /profiles(.:format)  {:action=>"create", :controller=>"profiles"}
new_profile GET    /profiles/new(.:format)  {:action=>"new", :controller=>"profiles"}
edit_profile GET    /profiles/:id/edit(.:format) {:action=>"edit", :controller=>"profiles"}
profile GET    /profiles/:id(.:format)  {:action=>"show", :controller=>"profiles"}
PUT    /profiles/:id(.:format)  {:action=>"update", :controller=>"profiles"}
DELETE /profiles/:id(.:format)  {:action=>"destroy", :controller=>"profiles"}
root        /(.:format)  {:action=>"new", :controller=>"users"}

1 Ответ

1 голос
/ 06 сентября 2011

Используете ли вы accepts_nested_attributes_for в своей модели пользователя?По крайней мере, это может очистить ваш код.Но, во всяком случае, я считаю, что проблема с вашими маршрутами.В дополнение к чтению этого кода, я предлагаю вам запустить «грабли-маршруты» в корне приложения, чтобы убедиться, что маршруты, которые вы пытаетесь использовать, действительно существуют.

Обновление: Для вашей конкретной кодовой базы вот что вам нужно сделать.

Используйте эти маршруты в вашем маршруте.rb:

resources :profiles
resources :users
root :to => "users#new"

Вам также необходимо изменить:

redirect_to profile_path до redirect_to @user.profile

redirect_to signup_path ... до redirect_to edit_profile_path(@user.profile)

Вот то, что я обычно делаю с пользователями и профилями, может помочь:

Строительные леса (только для контекста):

rails generate scaffold User username:string password:string
rails generate scaffold Profile user_id:integer email_address:string website:string

rout.rb:

resources :profiles
resources :users

controllers / users_controller.rb:

class UsersController < ApplicationController

  ...

  # GET /users/new
  def new
    @user = User.new
    @profile = Profile.new

    respond_to do |format|
      format.html
      format.xml  { render :xml => @user }
    end
  end

  # GET /users/1/edit
  def edit
    @user = User.find(params[:id])
    @profile = @user.profile.nil? ? Profile.new : @user.profile

    respond_to do |format|
      format.html
      format.xml  { render :xml => @user }
    end
  end

  # POST /users
  def create
    if params[:user][:profile]
      profile = params[:venue][:profile]
      params[:user].delete(:profile)
      params[:user].update({ :profile_attributes => profile })
    end

    @user = User.find(params[:id])

    respond_to do |format|
      if @user.save
        format.html { redirect_to :action => (@user.profile.nil? ? @user : @user.profile) }
        format.xml  { render :xml => @user, :status => :created, :location => @user }
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @user.errors, :status => :unprocessable_entity }
      end
    end
  end

  # PUT /users/1
  def update
    if params[:user][:profile]
      profile = params[:venue][:profile]
      params[:user].delete(:profile)
      params[:user].update({ :profile_attributes => profile })
    end

    @user = User.find(params[:id])

    respond_to do |format|
      if @user.update_attributes(params[:user])
        format.html { redirect_to :action => (@user.profile.nil? ? @user : @user.profile) }
        format.xml  { head :ok }
      else
        format.html { render :action => "edit" }
        format.xml  { render :xml => @user.errors, :status => :unprocessable_entity }
      end
    end
  end

  ...

end

models / profile.rb:

class Profile < ActiveRecord::Base
  belongs_to :user
end

models / user.rb:

class User < ActiveRecord::Base
  has_one :profile

  accepts_nested_attributes_for :profile
end

users / _form.html.erb:

<%= form_for(@user) do |f| %>

  ...

  <div class="field">
    <%= f.label :username %><br />
    <%= f.text_field :username %>
  </div>

  <div class="field">
    <%= f.label :password %><br />
    <%= f.password_field :password %>
  </div>

  <%= f.fields_for @profile, :profile do |ff| %>
    <div class="field">
      <%= ff.label :email_address %><br />
      <%= ff.text_field :email_address %>
    </div>
  <% end %>

  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

Используя этот тип процесса, кто-нибудь может создать пользователя и профиль, и единственные значения формы для профилябудут заполнены те, для которых вы указываете значения по умолчанию, или те, которые появляются в блоке fields_for.Я думаю, что то, что вы пытались сделать, не слишком сложно, но я думаю, что вы, возможно, неправильно подходили к вашему маршруту.

Приветствия

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...