我有一个客户控制器和支付控制器。创建客户端后,我希望自动重定向到新的付款表单,并将客户端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然后执行并跟随代码行?
我对这一切感到有些困惑,所以任何帮助都会非常感激。
答案 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}"
。