【问题标题】:Redirect to SHOW action in another controller重定向到另一个控制器中的 SHOW 操作
【发布时间】:2011-08-18 13:35:11
【问题描述】:

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

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

【问题讨论】:

  • rake routes 并检查所有生成的路线,看看你错过了什么。
  • 问题不在于缺少路线。他只是想路由到account_path(nil)

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


【解决方案1】:

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

【讨论】:

  • 我将@account = Account.find_by_id(params[:account_id]) 添加到我的新方法中,我上面的redirect_to 现在可以工作了。感谢您的帮助。
【解决方案2】:

我不会使用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 hack 来获取它。

耶!

【讨论】:

  • 这行得通,但我决定不使用这种方法,因为我的模型之间的关系比这更复杂。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-24
  • 1970-01-01
相关资源
最近更新 更多