Katharina Schreiber
Katharina Schreiber

Reputation: 1371

No route matches {:action=>"new", :controller=>"profiles", :id=>"address"}, missing required keys: [:user_id]

I work with Device and just added the 'wicked' gem to my Rails app. In my RegistrationsController I have defined the following:

class Users::RegistrationsController < Devise::RegistrationsController

  def new
    super
  end

  def create
    super
  end

  def update
    super
  end
  protected
    def after_sign_up_path_for(resource)
        user_steps_path 
    end

    def after_update_path_for(resource)
        new_user_profile_path(current_user.id) 
    end
end

Basically I wish my form to have one further step after sign up, which would be the address:

class UserStepsController < ApplicationController
    include Wicked::Wizard
    steps :address

    def show
      @user = current_user
      render_wizard
    end

end

After the User has given his address, I want him/her to be redirected to their profile, where they can also give the information about themselves. My thinking, this is an update action in my RegistrationsController. Or how do I redirect to the profile, after my multistep form is finilised, meaning the step address is done? Here is address.html.erb:

    <%= form_for @user, url: wizard_path do |f| %>
    <div class="field">
        <%= f.label :street %>
        <%= f.text_area :street %>
    </div>


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

  <% end %>

For now ActionContoller complains about my header routes and looks for id address and I don't get why... Here is my ProfilesContorller:

class ProfilesController < ApplicationController
  before_action :set_profile, only: [:show, :edit, :update, :destroy]

  def show
    @user = User.eager_load(:profile).find(params[:user_id])
    @profile = @user.profile
    @review = Review.new
    @reviews = Review.where(profile: @profile) 
  end

  def new
    @user = current_user
    @profile = Profile.new
  end

  def edit
    @profile = @user.profile
  end

  def create
    @user = current_user
    @profile = @user.build_profile(profile_params)

    respond_to do |format|
      if @profile.save
        format.html { redirect_to user_profile_path(current_user.id), notice: 'Profile was successfully created.' }
        format.json { render :show, status: :created, location: @profile }
      else
        format.html { render :new, notice: 'Did not save' }
        format.json { render json: @profile.errors, status: :unprocessable_entity }
      end
    end
  end

  def update
    respond_to do |format|
      if @profile.update(profile_params)
        format.html { redirect_to user_profile_path(current_user.id), notice: 'Profile was successfully updated.' }
        format.json { render :show, status: :ok, location: @profile }
      else
        format.html { render :edit }
        format.json { render json: @profile.errors, status: :unprocessable_entity }
      end
    end
  end

  def destroy
    @profile.destroy
    respond_to do |format|
      format.html { redirect_to users_url, notice: 'Profile was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

  private

    def set_profile
      @profile = current_user.profile
    end

    def profile_params
      params.permit(:about, :avatar)
    end

end

And here is the error part in my header.html.erb

      <% if current_user.profile == nil %>
        <li><span class="bg-primary text-white rounded"><%= link_to 'Create profile', new_user_profile_path%></span></li>
  <% else %>
    <li><span class="bg-primary text-white rounded"><%= link_to 'My profile', user_profile_path(@user) %></span></li>
  <% end %>

<li><span class="bg-primary text-white rounded"><%= link_to 'Log out', destroy_user_session_path, method: :delete %></span></li>

ActionController basically complains about the second line and the "new_user_profile_path". How did address got into profiles contoller -> new -> id and how do I procees with the error mentioned in the title. Thank you!

Upvotes: 0

Views: 79

Answers (1)

Vishal
Vishal

Reputation: 818

As per your Error, user_id is missing in your route

Try, new_user_profile_path(@user) in second line

So finally it should be <%= link_to 'Create profile', new_user_profile_path(@user)%>

Upvotes: 2

Related Questions