2014-09-20 49 views
1

我想在我的show.html.erb的底部有一个链接linksnew在不同的控制器中的动作。link_to不同控制器中的'新'动作?

class Sample < ActiveRecord::Base 
    belongs_to :song 
end 

class Song < ActiveRecord::Base 
    has_many :samples 
end 

所以,在show行动songs的底部,我要链接到newsamples。这看起来很容易,但我正在努力弄清楚这一点。我也想从歌曲传递ID的形式:song_id

回答

0
<%= link_to "New Sample", new_sample_path(:song_id => @song_id) %> 

哪里@song_id是具有该ID在它的变量。

+0

我得到一个错误“无路由匹配[POST]”/ samples/new“”。我的路线是资源:歌曲和资源:样本 – fiddy 2014-09-20 03:49:38

+0

这应该是一个link_to的GET。你是否试图在表单中使用它? – DGM 2014-09-21 00:19:04

0

link_to标签中设置路径,您可以通过在终端中运行rake_routes来获取标签。

防爆

link_to "New song", new_sample_path(@song) 

在上面@song给出的例子是当前页面的实例变量。

您也可以从这里得到一些想法:

link_to Base URL Randomly Changed

+0

对不起,我不确定你的意思是通过在终端中运行耙路径来设置路径。 – fiddy 2014-09-20 04:01:42

+0

@fiddy:在终端运行'rails s'启动服务器,就像运行'rake routes'一样,您将获得应用程序的所有路径 – 2014-09-20 05:05:26

0

宋型号:

accepts_nested_attributes_for :sample, allow_destroy: true 

路线:

resources :songs do 
    resources :samples 
end 

歌的显示文件:

<%= link_to "New Sample", new_song_sample_path(@song) %>  

的URL将是:

/songs/:song_id/sample/new 

试试这个,让我知道它的工作原理或不...我希望这有助于你

+0

它不呈现页面。 “#歌曲中的NoMethodError#show” – fiddy 2014-09-20 06:27:39

+0

@fiddy:向我显示您的控制器代码和路由文件 – 2014-09-20 07:00:40

+0

@fiddy:立即检查更新 – 2014-09-20 07:26:22

4

Fiddy ,因为你是新的,让我解释它是如何工作的...


Routes

你的问题是,你不明白的Rails路由结构 - 我希望能为你解释它。

Rails,因为它是一个MVC框架,为您创建一系列“路线”。这些“路线”存储在config/routes.rb的文件中。

路线,如由Rails文档描述如下:

Rails的路由器识别的URL并将它们分派到控制器的 动作。它还可以生成路径和URL,避免在您的视图中需要硬编码字符串 。

您应该考虑的最重要的事情就是您的方式the routes generate paths。这些路径只是Rails的“助手”方法,您可以从视图中调用这些方法。这些存在的理由有两方面 -

  1. 他们提供了访问/操纵数据的DRY (don't repeat yourself)方式
  2. 他们围绕对象构建,有助于保持Rails的
  3. 的面向对象的性质

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

-

Rails的

这使我们很好地欣赏到其中的Rails工作

Rails是一个MVC (model view controller)框架的方式。这似乎有点微不足道,但在现实中,它是了解Rails开发的最重要的方面之一,这里的原因:

enter image description here

Rails的软件系统的工作原理,采取“请求”(用户输入)然后路由他们到具体的controller#actions。这些控制器然后从数据库中构建model数据,并将其转换为变量或对象,您可以在view中使用这些变量或对象。

我之所以提到这一点,是因为这种类型的开发需要大量的习惯,因为程序的流程不是关于逻辑/功能,而是数据的可访问性。因此,当您询问路线或您的应用程序的其他部分时,您需要先记住您希望显示的数据以及您希望如何显示这些数据 - 这将使您能够构建使用&这将得到它的工作路线/控制器动作正确

-

修复

在你说的话,你去实现你想要的结果的方式方面将会使用一个nested route

#config/routes.rb 
resources :songs do 
    resources :samples #-> domain.com/songs/:song_id/samples/new 
end 

这将为您创建一条新路线(您可以通过在您的rails c(控制台)中点燃rake routes进行检查。这会给你一个路径使用您samples#new行动:

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

上面的链接将带您到samples#show动作,你就可以作为你从需要与尽可能多的数据来填充samples控制器。重要的是要注意的是,这个动作将有params[:song_id]可用于您从或建立一个对象,或者

+0

非常感谢您的详细回复。我只完成了一个关于Rails的视频教程系列,并没有解释很多这种逻辑,所以有很多记忆和猜测正在进行。我只有1个问题。路径正在生成,当我使用'rake routes'时,我会看到它。但是,表单生成会导致错误。在这一行:'<%= form_for @sample do | f | %>'我在下面的错误'NoMethodError Samples#new'中。该URL看起来是正确的,它也传递了参数。 – fiddy 2014-09-20 23:00:03

+0

它说它是什么方法/动作(IE是什么试图调用,但不可用)? – 2014-09-21 07:12:29

+0

未定义的方法\ samples_path为#<#:0x0000000431d7e8' – fiddy 2014-09-22 02:09:01

相关问题