【问题标题】:Ruby on Rails - Pass ID from another controllerRuby on Rails - 从另一个控制器传递 ID
【发布时间】:2017-10-12 09:50:20
【问题描述】:

我有两个模型。首先是 Taxirecord,其次是 Carpark。每个 Taxirecord 可能有自己的停车场。我在将taxirecord_id 传递给停车场记录时遇到问题。我有路线

car_new GET    /taxidetail/:taxirecord_id/carpark/new(.:format) carparks#new

我想将 :taxirecord_id(我正在编辑的出租车记录的 id)传递给我的创建控制器。 我的停车场型号:

class Carpark < ActiveRecord::Base
    belongs_to :taxirecord
end

在控制器中,我通过基于参数 :taxirecord_id 的 find 函数查找taxirecord_id,但在调用 create 时 id 为 nil。你能帮我找出我做错了什么以及如何解决这个问题吗?感谢您的帮助!

我的停车场控制器

class CarparksController < ApplicationController
    def new
            @car = Carpark.new
    end
    def create
            @car = Carpark.new(carpark_params, taxirecord_id: Taxirecord.find(params[:taxirecord_id]))
            if @car.save
                    flash[:notice] = "Zaznam byl ulozen"
                    redirect_to root_path
            else
                    flash[:notice] = "Zaznam nebyl ulozen"
                    render 'new'
            end

    end
private def carpark_params
                params.require(:carpark).permit(:car_brand, :car_type, :driver_name, :driver_tel)
        end

end

【问题讨论】:

  • 你的控制器里有什么?以及您如何执行对该路由的请求?
  • 显示您的完整代码,而不仅仅是您的代码说明。我怀疑问题是您没有使用必要的属性调用permit,但是如果没有看到代码,我无法正确回答您的问题!
  • 我不相信有可能弄清楚你在这里的意思。你需要更好地描述你想要的东西。显示更多代码可能会有所帮助。也可能是之前和之后的案例。
  • 编辑:添加控制器
  • 我要添加停车场,属于taxirecord_id关联的taxirecord

标签: ruby-on-rails ruby model controller associations


【解决方案1】:

我终于搞定了 我添加了&lt;%=link_to 'New Carpark', {:controller =&gt; "carparks", :action =&gt; "new", :taxirecord_id =&gt; @taxi_record.id }%&gt; 我的出租车记录表和停车场表&lt;%= hidden_field_tag :taxirecord_id, params[:taxirecord_id] %&gt; 还有我的停车场管理员:@carpark.taxirecord_id = params[:taxirecord_id] 感谢大家的大力支持和帮助!

【讨论】:

  • 很高兴它正在工作 - 快速查看 Rails 路由 (guides.rubyonrails.org/routing.html) 的链接格式 - 您可以在 link_to 字段中使用自动生成的路由,这是传统的方法。如果您有时间,请尝试一下我的回答-我个人认为这是“Railsy”的方法:) 此外,如果您的隐藏字段正常工作,您应该能够使用carpark_params 来通过它在,没有额外的线分配它。祝项目的其余部分好运!
  • 最后,我不知道为什么有人反对你的问题 - 我 +1 :)
  • 非常感谢@SRack。非常感谢您的支持和帮助! :)
【解决方案2】:

我倾向于使用类似的东西:

before_action :assign_taxirecord   

...

private

def assign_taxirecord
  @taxirecord = TaxiRecord.find(params[:taxirecord_id])
end

然后在创建动作中:

def create
  @car = @taxirecord.build_carpark(carpark_params)
  ...
end 

显然,需要根据您的要求进行一些调整(即,对于调用 before_action 的操作),但我希望这会有所帮助!

【讨论】:

  • 欢迎您!我已经从记忆中记下来了,并且相信 build_carpark 方法是在 has_one / belongs_to 方法中自动创建的。如果不是这样,有一个修补匠/请让我知道:)
【解决方案3】:

无需发送taxirecord id。

class Carpark < ApplicationRecord
  belongs_to :taxirecord
end


class Taxirecord < ApplicationRecord
  has_one :carpark
end

Rails.application.routes.draw do
  resources :taxirecords do 
    resources :carparks
  end
end


for new taxirecord
 t = Taxirecord.new(:registration => "efgh", :description =>"test")

for new carpark
 t.create_carpark(:description=>"abcd")


#=> #<Carpark id: 2, taxirecord_id: 2, description: "abcd", created_at: "2017-10-12 10:55:38", updated_at: "2017-10-12 10:55:38">

【讨论】:

  • 为什么不能这样:Taxirecord 编辑表格:&lt;%=link_to 'New Carpark', new_carpark_path(@taxi_record)%&gt; 和停车场控制器@carpark.taxirecord_id = @taxi_record.id?谢谢!
  • 请粘贴您的模型控制器和路由代码
  • 在 carpark_params 1st 添加taxirecord_id
猜你喜欢
  • 1970-01-01
  • 2014-10-12
  • 2016-02-03
  • 1970-01-01
  • 1970-01-01
  • 2010-12-21
  • 1970-01-01
  • 1970-01-01
  • 2012-11-07
相关资源
最近更新 更多