首页 > 解决方案 > 没有路由匹配 {:action=>"new", :controller=>"profiles", :id=>"address"},缺少必需的键:[:user_id]

问题描述

我使用 Device 并将“邪恶”的 gem 添加到我的 Rails 应用程序中。在我的 RegistrationsController 中,我定义了以下内容:

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

基本上,我希望我的表格在注册后能更进一步,即地址:

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

    def show
      @user = current_user
      render_wizard
    end

end

在用户给出他的地址后,我希望他/她被重定向到他们的个人资料,他们也可以在其中提供关于他们自己的信息。我的想法,这是我的 RegistrationsController 中的更新操作。或者,在我的多步骤表单完成后,我如何重定向到配置文件,这意味着步骤地址已完成?这是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 %>

现在 ActionContoller 抱怨我的标头路由并寻找 id 地址,但我不明白为什么......这是我的 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

这是我的 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 基本上抱怨第二行和“new_user_profile_path”。地址是如何进入配置文件控制器的 -> 新的 -> id 以及如何处理标题中提到的错误。谢谢!

标签: ruby-on-rails

解决方案


根据您的错误,user_id您的路线中缺少

试试,new_user_profile_path(@user)在第二行

所以最后应该是<%= link_to 'Create profile', new_user_profile_path(@user)%>


推荐阅读