Rails:在Controller中添加了新的Action,但是没有路径?

时间:2010-05-31 09:04:52

标签: ruby-on-rails

我尝试做以下事情: 用户在他的个人资料页面上。现在他编辑了他的个人资料。他点击了更新并保存了数据。 现在我想将用户重定向到另一种profile-edit-page。 我在users_controller.rb中执行了以下操作:

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

        respond_to do |format|
          if @user.update_attributes(params[:user])
            flash[:notice] = 'User was successfully updated.'
            if(@user.team_id != nil)
              format.html { redirect_to(@user) }
            else
              format.html { redirect_to choose_team_path }
            end
            format.xml  { head :ok }
          else
            format.html { render :action => "edit" }
            format.xml  { render :xml => @user.errors, :status => :unprocessable_entity }
          end
        end
      end


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

我创建了一个视图:/users/choose_team.html.erb

现在我收到以下错误:

undefined local variable or method `choose_team_path' for #<UsersController:0x1f56650>

所以我将choose_team添加到我的routes.rb:

 map.choose_team 'choose-team', :controller => 'users', :action => 'choose_team'

现在,在提交我的第一个编辑表单后,它会将我重定向到http://localhost:3000/choose-team 我收到以下错误:Couldn't find User without an ID

我想要的: 如果用户没有team_id,则应将其重定向到我的choose_team.html.erb以选择团队,否则应将其重定向到他的个人资料/节目。 怎么做?

编辑: 通过编写format.html { redirect_to :action => "choose_team" }代替format.html { redirect_to choose_team_path },它正在发挥作用。但是如何获得像/ users / 1 / choose_team这样的网址?目前它只是/ choose_team。

4 个答案:

答案 0 :(得分:1)

你必须像这样添加你的行动:

map.resources :users, :member=>{:choose-team=>:get}

因为,如果你有一个像index这样的动作,它返回的用户集合应该放在集合哈希中。如果您的操作特定于用户,则必须添加到:成员哈希,现在您将获得类似/users/1/choose_team

的网址

答案 1 :(得分:0)

您需要先在map.resources :users首先选择route.rb

之前选择此路线

答案 2 :(得分:0)

在route.rb中添加以下行并重新启动服务器

map.resources :users, :collection=>{:choose-team=>:get}

答案 3 :(得分:0)

format.html { redirect_to choose_team_path }

没有将id传递给choose_team_path。

您的choose_team操作使用:id参数但未提供一个参数。这就是为什么你得到没有ID错误的找不到用户的原因。