link_to' new'在不同的控制器中行动?

时间:2014-09-20 03:34:57

标签: ruby-on-rails ruby ruby-on-rails-4

我想在 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

传递给表单

4 个答案:

答案 0 :(得分:5)

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


Routes

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

Rails,因为它是一个MVC框架,构建了一系列&#34;路由&#34;为了你。这些&#34;路线&#34;存储在config/routes.rb的可用文件中。

路由,如Rails文档所述如下:

  

Rails路由器识别URL并将它们分派给控制器   行动。它还可以生成路径和URL,避免使用   视图中的硬编码字符串。

这里你应该考虑的最重要的事情是你the routes generate paths的方式。这些路径只是Rails&#34; helper&#34;方法,您可以从您的视图中调用。这些存在的原因是双重的 -

  
      
  1. 他们为您提供DRY (don't repeat yourself)访问/操作数据的方式
  2.   
  3. 它们围绕对象构建,有助于维护Rails的面向对象特性
  4.   

这些对您来说可能毫无意义。但是,您需要意识到,如果正确设置路线,它会极大地帮助您的应用程序的基础架构。

-

<强>滑轨

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

Rails是一个MVC (model view controller)框架。这可能看起来有些微不足道,但实际上,它是了解Rails开发最重要的方面之一,这就是原因:

enter image description here

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是当前页面的实例变量。

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

link_to Base URL Randomly Changed

答案 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

尝试这个,让我知道它的工作与否......我希望这能帮到你