【问题标题】:How to redirect from one action of controller A to an action of controller B and back in Rails?如何从控制器 A 的一个动作重定向到控制器 B 的一个动作并返回 Rails?
【发布时间】:2013-04-08 19:53:07
【问题描述】:

我有两个关联模型,EmployeeCompany

class Employee < ActiveRecord::Base
  attr_accessible :name

  belongs_to :company
  attr_accessible :company_id
end

class Company < ActiveRecord::Base
  attr_accessible :name, :industry, :owner

  has_many :employees
end

我想要实现的是,当用户在新员工表单中键入不存在的公司名称时,他/她应该被重定向到新公司表单,名称字段已经填充了值之前的表格,为要创建的公司填写它,然后被重定向到“员工成功创建”页面(但当且仅当公司首先创建时)。

我在创建员工的同时创建了一家公司,代码如下:

def create
  @employee = Employee.new(params[:employee])

  @company = Customer.find_or_create_by_name(params[:company][:name])
  @company.employees << @employee
  @company.save

  @employee.save
end

但是,这并没有让我选择填写公司的其余信息。

通过redirect_to 进行实验,我还设法将用户发送到编辑公司表单。

# one way to tell if the company has all its attributes filled
if @company.industry.blank?
  redirect_to edit_company_path(@company), notice: "Please edit the company details" and return
end

*and return 语句是必要的,否则我会收到“多次调用redirect_to”错误*

但是,这不是我们想要的行为 - 有两个原因:

  • 即使公司没有创建员工。
  • 没有通知用户创建员工。

所以,我的想法是我正在以正确的方式重定向到公司控制器和创建操作,并且我应该以某种方式重定向回我在员工控制器中的位置(就在@employee.save 之前)。但是怎么做?另外,这是最好的和“最常见的”方式吗?

【问题讨论】:

标签: ruby-on-rails redirect controller action back


【解决方案1】:

我看到的一个选项是将员工数据保存在会话 (session[:temp_employee] = params[:employee]) 中,然后重定向到创建公司。在公司控制器中,保存公司后,您可以检查会话中是否存在员工,然后将客户端重定向回以创建员工控制器的操作。

这还需要您:

  • 启用通过路径创建操作的访问权限(例如:get 'create', to: 'employees#create'
  • 在员工创建操作中,如果会话变量存在,则对属性执行操作,否则回退到参数哈希。

【讨论】:

    猜你喜欢
    • 2010-09-30
    • 2011-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多