如何在 rails URL helper 中传递对象

Posted

技术标签:

【中文标题】如何在 rails URL helper 中传递对象【英文标题】:How do I pass an object in the rails URL helper 【发布时间】:2022-01-23 19:27:38 【问题描述】:

我在理解如何在 rails 中设置路由以将对象传递到 URL 帮助程序时遇到问题。

我添加了一个新方法add_item

  def add_item
    @item = Item.create(item_params)
    puts @hospital.inspect
    puts @item.inspect
    @hospital.items << @item

    respond_to do |format|
      if @hospital.save
        format.html  redirect_to hospital_url(@hospital), notice: "Item was added to hospital" 
        format.json  render :show, status: :ok, location: @hospital 
      else
        format.html  render :edit, status: :unprocessable_entity 
        format.json  render json: @hospital.errors, status: :unprocessable_entity 
      end
    end
  end

我添加了对应的路线

  resources :hospitals do
    member do
      post :add_item
    end
  end

但是当我运行我的测试时使用

      post add_item_hospital_url(@hospital), params:  item:  item_code: item.item_code, description: item.description, gross_charge: item.gross_charge  

测试中的@hospital 不是nil,但在控制器上是。我究竟做错了什么? 我的路线似乎没问题。

add_item_hospital POST   /hospitals/:id/add_item(.:format)

【问题讨论】:

【参考方案1】:

实例变量@hospital在控制器中是nil,因为它没有被设置。也许你可以添加一个before_action 来设置实例变量的值,或者只是将它添加到add_item 方法中。

将模型传递给 URL 帮助程序时,可以在 params 哈希中找到该对象的 id

class HospitalsController < ApplicationController
  before_action :set_hospital, only: :add_item
  
  def add_item
    # ... your code here
  end

  private
    def set_hospital
      @hospital = Hospital.find(params[:id])
    rescue ActiveRecord::RecordNotFound
      # handle exception
    end
end

【讨论】:

我明白了!那么,当您使用 URL 助手并将 @var 传递给它时,它是如何工作的呢?我看到他们在更新和其他方法上这样做。 似乎在您的测试文件中,您在代码中的某处定义了@hospital,这就是它起作用的原因,但是控制器对测试的实例变量一无所知,这就是为什么您必须从:id 参数重新设置 啊!我懂了!因此,当我们将它传递给 URL 助手时,可以在参数中找到该 obj 的 id。谢谢!

以上是关于如何在 rails URL helper 中传递对象的主要内容,如果未能解决你的问题,请参考以下文章

Rails 4.2 - url helper 引发“ArgumentError:错误数量的参数(3 for 1..2)”

为啥 Ruby on Rails 的 URL Helper 在我的 URL 中加上句点?

如何将类添加到 image_tag rails helper

如何在 Rails 的集成测试中访问 View helper?

Rails,单击link_to helper后未加载javascript

如何在 Rails 中找到方法来自的模块/类?