【问题标题】:Rails 4 Passing Parameters From One Controller to AnotherRails 4 将参数从一个控制器传递到另一个控制器
【发布时间】:2014-01-14 10:42:26
【问题描述】:

我有一个客户控制器和一个付款控制器。创建客户端后,我想自动重定向到新的付款表单,并将客户端 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 不将对象保存到数据库然后执行并执行以下代码行吗?

我对这一切有点困惑,所以任何帮助都将不胜感激。

【问题讨论】:

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


    【解决方案1】:

    尝试更改此行

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

    看起来像这样

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

    【讨论】:

    • 您好,我已经进行了更改,但仍未解决问题。客户端 ID 仍未通过。
    • 您确定网址中没有client_id 吗?尝试在 @client.save 之后添加 puts "#{new_payment_url(:client_id => @client.id)}" 并从 rails 控制台检查。
    • 网址实际上是 ipaddress:3000/payments ...肯定没有发送 client_id
    • 如果你把app.new_payment_url(:client_id => Client.first.id)写成rails console会发生什么?
    • 它可能就在那里,你只是看不到它,因为有这么多的文字。使用这个技巧puts "=" * 50 + " #{new_payment_url(:client_id => @client.id)}"。您应该会看到 = 的墙,后跟 url
    【解决方案2】:

    您只能通过该行实例化一个新客户端

    @client = Client.new(client_params)
    

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

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

    @client = Client.create(client_params)
    

    【讨论】:

    • 抱歉死灵术。我才意识到这个问题实际上有多久了。
    【解决方案3】:

    尝试更改此行:

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

    看起来像这样:

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

    如果上述方法不起作用,则将“路径”字符串传递给 redirect_to 像这些 "/payment/new?client_id=#{@client.id}".

    【讨论】:

    • 不幸的是,这些都不起作用。 :client_id 是属于支付的属性,我在客户端控制器中调用它的方式是否有问题?
    • 如果可以的话,可以给我应用链接吗?
    • 对不起,我做不到。我已经发现,虽然 client_id 正在传递给新的付款表单,但是当我保存新的付款表单时,client_id 并没有保存。
    • 然后为隐藏字段分配客户ID的值
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多