设计+多态关联问题

时间:2014-07-10 01:38:55

标签: ruby-on-rails ruby ruby-on-rails-4 devise polymorphic-associations

我对Rails相当陌生,并且在理解我遗漏某些内容时遇到了问题。 我正在使用Rails 4,Devise,我有一个主User模型,只包含passwordemailuser_name这些是我的其他模型的常用字段:{ {1}},Artist。 我的关系设置如下:

Fan

还有一个模型class User < ActiveRecord::Base # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable and :omniauthable devise :database_authenticatable, :recoverable, :rememberable, :trackable, :validatable belongs_to :account, polymorphic: true validates_uniqueness_of :user_name end class Artist < ActiveRecord::Base has_one :user, as: :account, dependent: :destroy has_many :tracks, dependent: :destroy accepts_nested_attributes_for :user end class Fan < ActiveRecord::Base has_one :user, as: :account, dependent: :destroy accepts_nested_attributes_for :user end belongs_to

Artist

我已经设法让多态连接正常工作,创建一个艺术家及其创建用户。现在我正在尝试创建class Track < ActiveRecord::Base belongs_to :artist end 连接。目前我正在接受它 创建新歌,但它没有在创建时建立关联。我收到的曲目没有关联的Artist/Track

我的歌曲控制器看起来像这样:

Artist_id = nil

另外......成功后创建class TracksController < ApplicationController before_action :authenticate_user!, :except => [:index, :show] before_action :set_track, only: [:show, :edit, :update, :destroy] def new @track = Track.new @track.build_artist end def create @track = Track.new(track_params) if @track.save flash[:notice] = "Track was successfully created." redirect_to @artist else redirect_to new_artist_track_path end end 会给我一个ActionControllerError “无法重定向到nil!

任何帮助将不胜感激

修改:解决redirect_to @artist问题,将redirect_to更改为

redirect_to @artist

仍然无法弄清楚如何在创建中保存与艺术家在轨道中的关联

编辑#2:这是我的redirect_to artist_path(current_user)

track_params

编辑#3: 这是表格:

def track_params
  params.require(:track).permit(:track_title, :description, :track_type)
end

以下是创建后的日志:

  <%= bootstrap_form_for @track, :html => { :multipart => true } do |f| %>

  <div class="field">
    <%= f.label :track_title %><br>
    <%= f.text_field :track_title %>
  </div>
  <div class="field">
    <%= f.label :description %><br>
    <%= f.text_field :description %>
  </div>
  <div class="field">
    <%= f.label :track_type %><br>
    <%= f.text_field :track_type %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

2 个答案:

答案 0 :(得分:0)

@artist成员变量仅在每个请求中可用,因此您在新请求中创建的实例在创建请求中不可用,从技术上讲它是零。而且你没有重定向到记录,而是转向路线。

假设您已正确设置参数,并且正在创建关联,您可以重定向到artist_path(@ track.artist),但需要查看您的routes.rb文件以确保

答案 1 :(得分:0)

您可以在创建

后将艺术家设置为控制器中的当前用户
def create
  @track = Track.new(track_params)
  if @track.save
    self.update_attributes(artist: current_user)
    flash[:notice] = "Track was successfully created."
    redirect_to artist_path(@track.artist) 
  else
    redirect_to new_artist_track_path
  end
end