在另一个控制器中link_to'new'动作?

fid*_*ddy 1 ruby ruby-on-rails ruby-on-rails-4

我希望有我的底部的链接show.html.erblinksnew不同的控制器动作.

class Sample < ActiveRecord::Base
    belongs_to :song
end

class Song < ActiveRecord::Base
    has_many :samples
end
Run Code Online (Sandbox Code Playgroud)

因此,在底部show采取行动songs,我要链接到newsamples.这看起来很简单,但我很难弄清楚这一点.我也想将歌曲中的id传递给表格:song_id

Ric*_*eck 5

Fiddy,因为你是新手,让我解释一下这是如何工作的......


路线

您的问题是您不了解Rails路由结构 - 我希望能为您解释它.

Rails,因为它是一个MVC框架,为您构建一系列"路由".这些"路线"存储在可用的文件中config/routes.rb.

Rails文档中描述的路由如下:

Rails路由器识别URL并将它们分派给控制器的动作.它还可以生成路径和URL,从而无需在视图中对字符串进行硬编码.

这里你应该考虑的最重要的事情是路线为你生成路径的方式.这些路径只是Rails"帮助"方法,您可以从视图中调用它们.这些存在的原因是双重的 -

  1. 它们为您提供访问/操作数据的DRY(不要重复自己)方式
  2. 它们围绕对象构建,有助于保持Rails的面向对象特性

这些可能对您没有任何意义.但是,您需要意识到,如果正确设置路线,它会极大地帮助您的应用程序的基础架构.

-

轨道

这使我们非常了解Rails的工作方式

Rails是一个MVC(模型视图控制器)框架.这可能看起来有些微不足道,但实际上,它是了解Rails开发最重要的方面之一,这就是为什么:

在此输入图像描述

Rails软件系统通过获取"请求"(用户输入)然后它们路由到特定的来工作controller#actions.然后,这些控制器model从数据库构建数据,并将其转换为变量或对象,您可以在其中使用view.

我提到这个的原因是这种类型的开发需要大量的使用,因为你的程序流程不是逻辑/功能,而是数据的可访问性.因此,当您询问应用程序的路径或其他部分时,您需要首先记住您希望显示的数据,以及您希望如何显示数据 - 这将使您能够构建和使用路径/控制器动作将使其正常工作

-

固定

就你所说的而言,你想要实现你想要的结果的方式是使用嵌套路线:

#config/routes.rb
resources :songs do
   resources :samples #-> domain.com/songs/:song_id/samples/new
end
Run Code Online (Sandbox Code Playgroud)

这将为您创建一个新路线(您可以通过rake routesrails c(控制台)中触发来检查.这将为您提供用于操作的路径samples#new:

#app/views/songs/show.html.erb
<%= link_to @song.name, new_song_sample_path(@song) %>
Run Code Online (Sandbox Code Playgroud)

上面的链接将带您进入samples#show操作,您可以从samples控制器中获取所需的数据.需要注意的重要一点是,此操作params[:song_id]可用于从中构建对象或以其他方式构建对象