在另一个控制器中重定向到SHOW操作

时间:2011-08-18 03:42:04

标签: ruby-on-rails ruby ruby-on-rails-3

创建与特定帐户关联的人员后,如何重定向回“帐户”页面?

account_id通过URL参数传递给CREATE Person操作,如下所示:

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动作重定向。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:7)

params[:account_id]存在于表单中,但当您将其传递给create时,您会将其发送到person哈希,因此您可以通过{{1}访问它}

params[:person][:account_id]params[:account_id],因此路线不好。说实话,我不确定原因,但nil最终路由到resource_path(nil)而不是destroy。在任何一种情况下,它都是没有show参数的损坏路线。

id

Rails本身会理解最后一个选项,确定记录类的路径,并从# 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 获取id

答案 1 :(得分: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的!