2011-08-18 115 views
2

创建与特定帐户关联的人员后,如何重定向回帐户页面?重定向到另一个控制器中的SHOW操作

的ACCOUNT_ID通过URL参数传递给CREATE人称动作如下:

http://localhost:3000/people/new?account_id=1 

下面是代码:

<h2>Account: 
    <%= Account.find_by_id(params[:account_id]).organizations. 
     primary.first.name %>  
</h2> 

<%= form_for @person do |f| %> 

    <%= f.hidden_field :account_id, :value => params[:account_id] %><br /> 
    <%= f.label :first_name %><br /> 
    <%= f.text_field :first_name %><br /> 
    <%= f.label :last_name %><br /> 
    <%= f.text_field :last_name %><br /> 
    <%= f.label :email1 %><br /> 
    <%= f.text_field :email1 %><br /> 
    <%= f.label :home_phone %><br /> 
    <%= f.text_field :home_phone %><br /> 
    <%= f.submit "Add person" %> 

<% end %> 

class PeopleController < ApplicationController 

    def new 
     @person = Person.new 
    end 

    def create 
     @person = Person.new(params[:person]) 
     if @person.save 
      flash[:success] = "Person added successfully" 
      redirect_to account_path(params[:account_id]) 
     else 
      render 'new' 
     end 
    end 
end 

当我提交上述形式出现以下错误消息:

Routing Error 

No route matches {:action=>"destroy", :controller=>"accounts"} 

为什么redirect_to路由到DESTROY操作?我想通过SHOW操作重定向。任何帮助将不胜感激。

+0

'耙路线'并检查所有生成的路线,看看你缺少什么。 –

+0

问题不是缺失的路线。他只是试图路由到'account_path(nil)'。 – numbers1311407

回答

7

params[:account_id]存在形式,但是当你把它传递给create你沿着person散列发送它,所以你通过params[:person][:account_id]

params[:account_id]访问它是nil,因此不好路线。说实话,我不知道为什么,但resource_path(nil)结束路由到destroy而不是show。无论哪种情况,这是一条没有id参数的断路线。

# so you *could* change it to: 
redirect_to account_path(params[:person][:account_id]) 

# or simpler: 
redirect_to account_path(@person.account_id) 

# but what you probably *should* change it to is: 
redirect_to @person.account 

Rails会本质上理解这个最后的选择,从类的记录确定的路径,并获得id#to_param

+0

这是为什么被低估? –

+0

不要偏,但我想知道的一样。 – numbers1311407

+0

我将@account = Account.find_by_id(params [:account_id])添加到了我的NEW方法中,现在我的上面有redirect_to。谢谢你的帮助。 –

1

我不会通过使用hidden_field通过这一点。相反,使用嵌套的资源:

resources :account do 
    resources :people 
end 

然后有形式的帐户对象:

<%= form_for [@account, @person] do |f| %> 
    ... 
<% end %> 

@account对象应该呈现的形式,像这样的线路的动作设置:

@acccount = Account.find(params[:account_id]) 

然后,当表单提交你必须在行动params[:account_id]不丑hidden_field黑客得到它。

Yippee!

+0

这有效,但我决定不采用这种方法,因为我的模型之间的关系比这更复杂。谢谢你的帮助。 –

相关问题