我想在 show.html.erb 的底部添加一个链接links
到另一个控制器中的new
操作。
class Sample < ActiveRecord::Base
belongs_to :song
end
class Song < ActiveRecord::Base
has_many :samples
end
因此,在show
的{{1}}操作的底部,我想链接到songs
new
。这看起来很简单,但我很难弄清楚这一点。我还想将歌曲中的id作为samples
答案 0 :(得分:5)
Fiddy,因为你是新手,让我解释一下这是如何运作的......
您的问题是您不了解Rails路由结构 - 我希望能为您解释。
Rails,因为它是一个MVC框架,构建了一系列&#34;路由&#34;为了你。这些&#34;路线&#34;存储在config/routes.rb
的可用文件中。
路由,如Rails文档所述如下:
Rails路由器识别URL并将它们分派给控制器 行动。它还可以生成路径和URL,避免使用 视图中的硬编码字符串。
这里你应该考虑的最重要的事情是你the routes generate paths的方式。这些路径只是Rails&#34; helper&#34;方法,您可以从您的视图中调用。这些存在的原因是双重的 -
- 他们为您提供DRY (don't repeat yourself)访问/操作数据的方式
- 它们围绕对象构建,有助于维护Rails的面向对象特性
醇>
这些对您来说可能毫无意义。但是,您需要意识到,如果正确设置路线,它会极大地帮助您的应用程序的基础架构。
-
<强>滑轨强>
这使我们非常了解Rails的工作方式
Rails是一个MVC (model view controller)框架。这可能看起来有些微不足道,但实际上,它是了解Rails开发最重要的方面之一,这就是原因:
Rails软件系统通过&#34;请求&#34; (用户输入)然后路由它们到特定的controller#actions
。然后,这些控制器会从数据库中构建model
数据,并将其转换为变量或对象,您可以在view
中使用这些数据。
我提到这一点的原因是这种类型的开发需要大量的使用,因为您的程序流程不是逻辑/功能,而是数据的可访问性。因此,当您询问路线或应用的其他部分时,您需要首先记住您希望显示的数据,以及您希望如何显示数据 - 这将为您提供建设和发展的能力使用路由/控制器操作,使其正常工作
-
<强>修正强>
就您所说的内容而言,您实现所需结果的方式是使用nested route:
#config/routes.rb
resources :songs do
resources :samples #-> domain.com/songs/:song_id/samples/new
end
这将为您创建一条新路线(您可以在rake routes
(控制台)中点按rails c
进行检查。这将为您提供路径您的samples#new
操作:
#app/views/songs/show.html.erb
<%= link_to @song.name, new_song_sample_path(@song) %>
以上链接将转到samples#show
操作,您可以使用samples
控制器中的所需数据填充该数据。需要注意的重要一点是,此操作将params[:song_id]
可用于构建对象或以其他方式
答案 1 :(得分:0)
<%= link_to "New Sample", new_sample_path(:song_id => @song_id) %>
@song_id
是其中包含该ID的变量。
答案 2 :(得分:0)
在link_to
标记中设置路径,您可以通过在终端中运行rake_routes
来获取该路径。
实施例
link_to "New song", new_sample_path(@song)
在上面给出的示例中,@song
是当前页面的实例变量。
你也可以从这里得到一些想法:
答案 3 :(得分:0)
歌曲模型:
accepts_nested_attributes_for :sample, allow_destroy: true
<强>路线:强>
resources :songs do
resources :samples
end
歌曲的显示文件:
<%= link_to "New Sample", new_song_sample_path(@song) %>
在网址中将是:
/songs/:song_id/sample/new
尝试这个,让我知道它的工作与否......我希望这能帮到你