Ruby rails。未定义的方法错误,创建嵌套的资源对象

时间:2016-01-02 15:08:05

标签: ruby-on-rails routes resources nested nomethoderror

我正在尝试渲染表单以上传歌曲。 我有播放列表模型和歌曲模型,歌曲是播放列表的嵌套资源。

使用简单的表单,当我尝试将新歌部分渲染时,我得到if (str.charAt(i)>=48 && str.charAt(i)<=48+9) { // english digit builder.append((char)(str.charAt(i)-48+1632)); // convert from english to arabic digit 在路线中,新的歌曲路径是undefined method songs_path for #<#<Class:0x007fdc51980870>但似乎并不是简单的形式知道这一点。

歌曲控制器:

new_playlist_song

播放列表控制器:

class SongsController < ApplicationController


  def new
      @song = Song.new
  end

  def create
    @song = Song.new(song_params)
    if @song.save
      flash[:info] = "Song uploaded sensually"
      redirect_to user_path(current_user)
else
      render 'new'
    end
  end

  def index
    @song = Song.all
  end

  private

    def song_params
      params.require(:song).permit(:audio)
  end

end

歌曲模型:

class PlaylistsController < ApplicationController
  before_action :find_playlist, only: [:edit, :update, :destroy]


  def index
    @playlists = Playlist.all
  end

  def new
    if user_signed_in?
    @playlist = current_user.playlists.new
  else
     redirect_to(root_url)
     flash[:danger] = "You have to register to purchase gigs"
   end
  end

  def create
    @playlist = current_user.playlists.new
    @playlist.user_id = current_user.id
    if @playlist.save
      redirect_to new_playlist_path
    else
      render 'new'
    end
  end

  def destroy
     @playlist = Playlist.find(params[:id])
     if @playlist.present?
       @playlist.destroy
       redirect_to playlists_path
  end
  end


  private

  def find_playlist
    @playlist = Playlist.find(params[:id])
  end

end

播放列表模型:

class Song < ActiveRecord::Base

  belongs_to :playlist
  has_attached_file :audio
  validates_attachment_presence :audio
  validates_attachment_content_type :audio, :content_type => [ 'audio/mp3','audio/mpeg']


end

路线:

class Playlist < ActiveRecord::Base
  belongs_to :user
  has_many :songs
end

创建新歌曲的用户个人资料链接:

resources :playlists do
    resources :songs
  end

我为simple_form表单尝试了一些变体。 新歌偏1:

<p> <%= @user.playlist.user_id %> </p>
  <p> <%= @user.playlist.created_at %> </p>
<% if @user == current_user %>
  <p> <%= link_to "Uploaad track", new_playlist_song_path(@user) %>
<% end %>

另一次尝试:

<%= simple_form_for ([@playlist, @song]) do |f| %>
<%= f.file_field :audio %>
 <%= f.button :submit %>
<% end %>

我只是无法显示表单,我无法弄清楚为什么不。任何想法都将不胜感激,谢谢。

2 个答案:

答案 0 :(得分:0)

正如评论中所指出的那样songs_path未在您的代码中引用,因此它不应该存在,因为它是playlist的子资源。
如果要列出所有可用路由,只需运行rake routes并确保代码引用现有路径。

答案 1 :(得分:0)

我没有定义该歌曲所属的播放列表。

添加到控制器

def create
    @song = current_user.playlist.songs.new song_params
    @song.playlist_id = @playlist.id
    if @song.save

def find_playlist
    @playlist = Playlist.find(params[:id])
  end

然后以简单的形式

<%= simple_form_for ([@playlist, @playlist.songs.build]) do |f| %>

有效。