Rails 4将参数从一个控制器传递到另一个控制器

时间:2014-01-14 10:42:26

标签: ruby-on-rails model-view-controller ruby-on-rails-4

我有一个客户控制器和支付控制器。创建客户端后,我希望自动重定向到新的付款表单,并将客户端ID传递给付款。

在客户模型中:

has_many :payments

在付款模式中:

belongs_to :client

在客户控制器中:

def create
@client = Client.new(client_params)

respond_to do |format|
  if @client.save
    format.html { redirect_to new_payment_url (:client_id => @client.id) }
    format.json { render action: 'show', status: :created, location: @client }
  else
    format.html { render action: 'new' }
    format.json { render json: @client.errors, status: :unprocessable_entity }
  end
end

在付款控制器中

  def new
    @payment = Payment.new
    @client = Client.where(:id => params[:client_id])
  end

当我创建客户端时,它会重定向到新的付款表单,但客户端ID不会被传递。当我尝试保存该付款时,我收到错误消息,说客户端不能为空。

我知道你没有先保存它就不能将对象传递给另一个控制器,但我的理解是: i)我不是试图通过整个客户端对象,只是id和 ii)不是@ client.save将对象保存到DB然后执行并跟随代码行?

我对这一切感到有些困惑,所以任何帮助都会非常感激。

3 个答案:

答案 0 :(得分:2)

尝试更改此行

format.html { redirect_to new_payment_url (:client_id => @client.id) }

看起来像这样

format.html { redirect_to new_payment_url(:client_id => @client.id) }

答案 1 :(得分:1)

您只能通过

行实例化新客户
@client = Client.new(client_params)

因为@client在保存记录之前不会有id。

由于我假设你想要创建一个记录,然后通过调用create而不是new来进一步处理数据实际上持久化记录。

@client = Client.create(client_params)

答案 2 :(得分:0)

尝试更改此行:

format.html { redirect_to new_payment_url (:client_id => @client.id) }

看起来像这样:

format.html { redirect_to new_payment_path(:client_id => @client.id) }

如果上述方法不起作用,则将'path'字符串传递给redirect_to "/payment/new?client_id=#{@client.id}"