【问题标题】:Devise + Polymorphic association questions设计+多态关联问题
【发布时间】:2014-07-10 01:38:54
【问题描述】:

我对 Rails 还很陌生,在理解我遗漏的地方时遇到了问题。 我正在使用 Rails 4、Devise,并且我有一个主要的 User 模型,它只包含 passwordemailuser_name,它们是我的其他模型的常见字段:ArtistFan。 我的关系是这样设置的:

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

的 Track

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

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


【解决方案1】:

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

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

【讨论】:

  • 我能够通过更改为来解决 redirect_to @artist:redirect_to artist_path(current_user) 似乎仍然无法弄清楚为什么创建没有创建与艺术家的关联
  • 既然您已经发布了更多的参数和日志,我看不到艺术家的任何参数。艺术家的属性需要在表单上,​​因为您使用的是accepts_nested_attributes_for。
  • 或者艺术家只是打算成为current_user,在这种情况下您不需要使用accepts_nested_attributes_for,但需要将艺术家保存在轨道上,有几种方法可以做到,但需要先了解你的意图。
  • User 是 Devise 类,只处理 3 种不同用户类型的身份验证。 Artist、Fan、接受来自 User、Track belongs_to Artist、Artist has_many Tracks 的嵌套属性,所以是的,当保存新 Track 时,它需要与 current_user 或正在创建它的 Artist 相关联。您只能将曲目创建为当前登录的艺术家
  • 好吧,这不是 accept_nested_attributes_for 的工作方式。 Accepts_nested 的想法是表单具有您使用 Accepts_nested 指定的模型的字段。您可能希望将 after_create 回调添加到 Track 模型以设置 Artist。请参阅下面的答案
【解决方案2】:

创建后可以在控制器中将艺术家设置为当前用户

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        

【讨论】:

    猜你喜欢
    • 2011-04-02
    • 1970-01-01
    • 2013-06-07
    • 2020-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多