【发布时间】:2014-07-10 01:38:54
【问题描述】:
我对 Rails 还很陌生,在理解我遗漏的地方时遇到了问题。
我正在使用 Rails 4、Devise,并且我有一个主要的 User 模型,它只包含 password、email 和 user_name,它们是我的其他模型的常见字段: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_toArtist:
class Track < ActiveRecord::Base
belongs_to :artist
end
我已经设法让多态连接正常工作,创建了一个 Artist 和它的创建用户。现在我正在尝试创建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
另外...在成功创建 redirect_to @artist 后给我一个 ActionControllerError
"无法重定向到 nil!
任何帮助将不胜感激
编辑:通过将redirect_to @artist 更改为解决了redirect_to 问题
redirect_to artist_path(current_user)
仍然无法弄清楚如何在创建时保存与 Artist in Track 的关联
编辑#2:这是我的track_params
def track_params
params.require(:track).permit(:track_title, :description, :track_type)
end
编辑#3: 表格如下:
<%= 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 %>
以下是创建后的日志:
Started POST "/tracks" for 127.0.0.1 at 2014-07-10 00:03:08 -0600
Processing by TracksController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"TzzOJrRmCzAcqdJcm+X5vSfKoHiL36T/yqUsdrpP+Ew=",
"track"=>{"track_title"=>"Track", "description"=>"Test track ", "track_type"=>"Demo"}, "commit"=>"Create Track"}
User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = 1 ORDER BY "users"."id" ASC LIMIT 1 (0.0ms) begin transaction SQL (261.5ms) INSERT INTO "tracks" ("created_at", "description", "track_title", "track_type", "updated_at") VALUES (?, ?, ?, ?, ?) [["created_at", "2014-07-10 06:03:08.377238"], ["description", "Test track "], ["track_title", "Track"], ["track_type", "Demo"], ["updated_at", "2014-07-10 06:03:08.377238"]] (45.2ms) commit transaction
Redirected to http://localhost:3000/artists/1
Completed 302 Found in 312ms (ActiveRecord: 306.9ms)
【问题讨论】:
-
你能发布你的
track_params method吗?你必须在Track模型中包含accepts_nested_attributes_for :artist。 -
@Pavan edit#2 上面有我的 track_params 方法,我的 Track 模型上没有 accept_nested_atributes_for :artist 作为我读到的关于如何建立关联的所有内容,没有提到,这是必需的吗?我上面的两个模型。
-
您可以将您的
form code发布到您创建track的位置吗?在form submit上发布server log information也会有所帮助。 -
@Pavan 见上面的编辑#3。我有一个设计用户类,正如您所见,它用于设计身份验证,它肯定会让背后更加痛苦。该表单是多部分的,以适应稍后添加的回形针上传。
-
您的表单中没有
artist_id的任何输入,那么您希望它如何保存?
标签: ruby-on-rails ruby ruby-on-rails-4 devise polymorphic-associations