Rails - 在link_to中传递id参数

26

我试图将当前页面的参数(id)传递到下一页,以便我可以创建一个依赖模型的条目。

即Project有Bids,Bids属于Projects。

因此,在项目的展示页面上,我添加了链接

<%= link_to "New Bid", new_bid_path(@project) %>

这段代码创建并执行了一个 URL:"http://localhost:3000/bids/new.2"

我有...

def new
    @bid = Bid.new
    @project =  Project.find(params[:id])
end

我在竞标控制器中,但我一直收到错误消息“找不到 ID 为 X 的项目”,发生了什么?为什么我不能传递 ID?


1
你是如何设置路由的呢?看起来有点奇怪,你会有一个以“new.2.”结尾的URL。如果你只是声明了资源:bids,它默认并不真正接受id参数,所以像new_bid_path(:id)这样的操作需要一些额外的配置。 - Will Ayd
没错,就是这样……我把链接改成了...... <%= link_to "新竞标", :controller => "bids", :action => "new", :id => @project %>...... 现在它完美地工作了,谢谢。 - ChrisWesAllen
2个回答

54

如果您的出价不是项目的嵌套资源,则可以将project_id作为参数添加到路径中:

<%= link_to "新建出价", new_bid_path(:project => @project.id) %>

def new  
  @bid = Bid.new  
  @project =  Project.find(params[:project])  
end

否则:

#routes.rb

map.resources :projects do |project|  
  project.resources :bids
end

<%= link_to "新建项目投标", new_project_bid_path(@project) %>

def new  
  @project =  Project.find(params[:project_id])    
  @bid = @project.bids.build  
end  

4
你不知道我为此寻找了多久,付出了多少艰辛。谢谢。 - Ryan

4

解决这类问题的好方法是查看参数中发送了什么内容。可以通过调试来实现。

<%= debug params # or any variable%>

通过这些信息,你将看到(并学习)你向控制器发送了哪些类型的参数。


1
如果您这样做,请确保在代码块中包含“if Rails.env.development?”,否则此内容也会出现在生产环境中。 - Will Ayd
我已经制作了 "<%= link_to "New Bid", new_bid_path(@project) debug params %>" 并且参数正在传递...我是否在控制器中以某种错误的方式尝试调用参数? - ChrisWesAllen
不,你需要将标签(单独)放在你的“新”视图中。 - Gareve
这是关于编程的内容,请将其翻译成中文。只返回已翻译的文本:嗯,这会产生---!map: ActiveSupport::HashWithIndifferentAccess 格式:"2" 动作:新 控制器:出价 - ChrisWesAllen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接