首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AssociationTypeMismatch在rails中是什么意思?我得到了嵌套属性的错误

AssociationTypeMismatch在rails中是什么意思?我得到了嵌套属性的错误
EN

Stack Overflow用户
提问于 2012-05-10 19:33:39
回答 4查看 1.3K关注 0票数 1

我有一个系统设置,用户可以张贴微博(基本上是状态更新),并上传照片与微博。

我有:

微柱模型(has_one照片) Photo_album模型(has_many照片)照片模型(belongs_to micropost,belongs_to photo_album)

用户在文本区域填写文本并选择照片。提交微博表格后,将更新与微博相关的数据,如内容、created_at等。

同时,我希望我的照片表(照片模型)更新与照片选择,用户作出的,但正确的相册。如果您在下面查看,您可以在我的users_controller中看到实例变量@photo的值。这可以确保上传的照片链接到正确的相册,该相册名为“微博相册”。它的目的是连接到所有与微信相关的照片。

我有一个Users_controller:

代码语言:javascript
复制
  def new
     @user = User.new 
     @micropost = Micropost.new(:user_id => users_id)
     @photo = Photo.new(:photo_album_id => PhotoAlbum.where(:user_id => current_user.id, :album_title => "microposts album").first.id)
  end

从我之前提出的一个问题中可以确定,我需要使用accepts_nested_attributes_for,fields_for,以便能够用一个表单更新多个模型。我就是这样安排的。

微信模型:

代码语言:javascript
复制
class Micropost < ActiveRecord::Base

  belongs_to :user
  has_one  :photo
  accepts_nested_attributes_for :photo
  attr_accessible :content, :user_id, :poster_id, :username, :image, :remote_image_url

end

图片模型:

代码语言:javascript
复制
class Photo < ActiveRecord::Base

  belongs_to :photo_album

    attr_accessible :photo_album_id, :photo_title, :image, :remote_image_url
    mount_uploader :image, ImageUploader

end

最后这里是微信表格:

代码语言:javascript
复制
= form_for @micropost, :remote => true do |f|
    = f.fields_for @photo do |p|
        = p.file_field :image
    = f.hidden_field :user_id
    = f.text_area :content
    = f.submit "Post"

--首先我得到了一个错误:

代码语言:javascript
复制
ActiveModel::MassAssignmentSecurity::Error (Can't mass-assign protected attributes: photo):

我有点困惑,因为我认为属性是自动分配的。至少这是我在文档里读到的。无论如何,我继续添加:照片到微博模型attr_accessible白名单。

,第一个错误,然后我得到了一个:

代码语言:javascript
复制
ActiveRecord::AssociationTypeMismatch (Photo(#2169424320) expected, got ActiveSupport::HashWithIndifferentAccess(#2157396720)):

也许我误解了这个特性是如何工作的,但是我读过,也看过3.2.3API文档,但没有看错地方。

我真的很感激你能帮我把这件事做好。

提前谢谢,我希望这个长柱被推开了。只是想提供所有这些信息会让人们明白我想做的更好。

亲切的问候

更新:使用:photo_attributes而不是照片的给了我以下错误:

代码语言:javascript
复制
Started POST "/microposts" for 127.0.0.1 at 2012-05-10 21:01:11 +0100
[02b23327ad83000f75c418d8739e7f49] [127.0.0.1] Processing by MicropostsController#create as JS
[02b23327ad83000f75c418d8739e7f49] [127.0.0.1]   Parameters: {"micropost"=>{"photo"=>{"image"=>#<ActionDispatch::Http::UploadedFile:0x00000102c293d8 @original_filename="7seriesbmw.jpeg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"micropost[photo][image]\"; filename=\"7seriesbmw.jpeg\"\r\nContent-Type: image/jpeg\r\n", @tempfile=#<File:/var/folders/fh/fhADKPjGG8qSuCeoHCTNYE+++TI/-Tmp-/RackMultipart20120510-14787-1e1mrhh>>}, "user_id"=>"2", "content"=>"ioo"}, "commit"=>"Post", "utf8"=>"✓", "authenticity_token"=>"/y8Lr+e7xgabt60GWxnMGvCtIi7IjqrYDoA84vAqYcE=", "remotipart_submitted"=>"true", "X-Requested-With"=>"IFrame", "X-Http-Accept"=>"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01"}
[02b23327ad83000f75c418d8739e7f49] [127.0.0.1]   User Load (0.3ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` = 2 LIMIT 1
[02b23327ad83000f75c418d8739e7f49] [127.0.0.1] Completed 500 Internal Server Error in 649ms
[02b23327ad83000f75c418d8739e7f49] [127.0.0.1] 
ActiveModel::MassAssignmentSecurity::Error (Can't mass-assign protected attributes: photo):
  app/controllers/microposts_controller.rb:9:in `create'

将attr_accessor改为:attr_accessor而不是:photo_attributes:

代码语言:javascript
复制
Started POST "/microposts" for 127.0.0.1 at 2012-05-10 21:20:07 +0100
[985e0f204bf7ffac1f7c02fbec35ad9b] [127.0.0.1] Processing by MicropostsController#create as JS
[985e0f204bf7ffac1f7c02fbec35ad9b] [127.0.0.1]   Parameters: {"micropost"=>{"photo"=>{"image"=>#<ActionDispatch::Http::UploadedFile:0x00000102f8a3b0 @original_filename="7seriesbmw.png", @content_type="image/png", @headers="Content-Disposition: form-data; name=\"micropost[photo][image]\"; filename=\"7seriesbmw.png\"\r\nContent-Type: image/png\r\n", @tempfile=#<File:/var/folders/fh/fhADKPjGG8qSuCeoHCTNYE+++TI/-Tmp-/RackMultipart20120510-15197-9rt2xn>>}, "user_id"=>"2", "content"=>"pp"}, "commit"=>"Post", "utf8"=>"✓", "authenticity_token"=>"/y8Lr+e7xgabt60GWxnMGvCtIi7IjqrYDoA84vAqYcE=", "remotipart_submitted"=>"true", "X-Requested-With"=>"IFrame", "X-Http-Accept"=>"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01"}
[985e0f204bf7ffac1f7c02fbec35ad9b] [127.0.0.1]   User Load (0.4ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` = 2 LIMIT 1
[985e0f204bf7ffac1f7c02fbec35ad9b] [127.0.0.1] Completed 500 Internal Server Error in 452ms
[985e0f204bf7ffac1f7c02fbec35ad9b] [127.0.0.1] 
ActiveRecord::AssociationTypeMismatch (Photo(#2180069640) expected, got ActiveSupport::HashWithIndifferentAccess(#2153916820)):
  app/controllers/microposts_controller.rb:9:in `create'

微邮政控制器创建动作:

代码语言:javascript
复制
def create


    if params[:micropost][:user_id].to_i == current_user.id
     @micropost = current_user.microposts.build(params[:micropost])

     @comment = Comment.new(:user_id => current_user.id)
        respond_to do |format|
            if @micropost.save


            format.js   { render :post_on_springboard }

            end
        end
    else

    user = User.find_by_username(params[:micropost][:username])
    @micropost = user.microposts.build(params[:micropost])
    if @micropost.save

    UserMailer.new_wall_post_notification(user, current_user).deliver if user.email_notification == 1

    flash[:success] = "Micropost posted"
    redirect_to root_path+user.username
    else
    flash[:error] = "#{@micropost.errors.full_messages.first}"
    redirect_to root_path+user.username
    end

    end

end
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-05-11 13:18:25

改变

代码语言:javascript
复制
f.fields_for @photo 

代码语言:javascript
复制
f.fields_for :photo 

加上

代码语言:javascript
复制
@micropost.build_photo(:photo_album_id => :photo_album_id => current_user.photo_albums.find_by_album_title("microposts album").id) 

我的microposts_controller解决了我的问题

票数 0
EN

Stack Overflow用户

发布于 2012-05-10 22:54:23

您想要做的很多事情都与关系有关,而且您应该能够让rails约定为您工作。如果您开始为使用rails编写一些相当简单的代码,这通常是个坏兆头。

我会先关注你的路线。

例如,如果你将照片嵌套在相册中,比如。

代码语言:javascript
复制
resources :albums do
  resources :photos
end

然后,您将获得许多您想要的路径和功能。

确保您的表单使用form_for [@album, @post]之类的东西,这将与您的accepts_nested_attributes_for一起使用

票数 1
EN

Stack Overflow用户

发布于 2012-05-10 19:41:57

尝试将:photo_attributes添加到micropost模型中的attar_accessible列表中

我认为,这应该能解决第一个错误。

还在调查第二个。

您能否从表单中发布完整的堆栈跟踪,这可能是控制器方法中的一个问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10540949

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档