0

我想通過構建一個網站來學習Ruby on Rails。用戶可以添加內容:帖子和圖片。帖子和圖片可以有一個或多個標籤。我希望每個關係都是HABTM,這樣我就可以通過特定的標籤輕鬆訪問帖子,圖片,反之亦然。窗體爲兩個HABTM關係中的對象,Rails 3

我正在嘗試將表單添加到帖子和圖片的標籤。當我提交任何形式,我得到的錯誤是:

POST http://localhost:8080/post/1/tags 500 (Internal Server Error)

當我看到返回的對象(這是兩種形式相同):

未定義的方法`POST_ID」爲#Tag id:nil,name:「asdf」>上線'@ tag.save'

我已經嘗試添加post_id,picture_id到Tag的attr_accesible;沒有骰子。 感謝您的幫助!我覺得我只是缺少一些小東西。

我的模型:

class Tag < ActiveRecord::Base 
    attr_accessible :name 

    has_and_belongs_to_many :pictures 
    has_and_belongs_to_many :posts 
    validates :name, :presence => true 
    validates :name, :uniqueness => { :scope => :post_id } 
    validates :name, :uniqueness => { :scope => :picture_id } 
end 

class Post < ActiveRecord::Base 
    attr_accessible :content, :title 

    belongs_to :user 
    has_and_belongs_to_many :tags 
end 

class Picture < ActiveRecord::Base 
     attr_accessible :image, :name 

     belongs_to :user 
     has_and_belongs_to_many :tags 
end 

遷移:

class CreateTags < ActiveRecord::Migration 
    def change 
    create_table :tags do |t| 
     t.string :name 
    end 

    create_table :pictures_tags, :id => false do |t| 
     t.references :picture, :tag 
    end 
    end 
end 

class CreatePostsTags < ActiveRecord::Migration 
    def change 
    create_table :posts_tags, :id => false do |t| 
     t.references :post, :tag 
    end 
    end 
end 
在我看來

<%= form_for([@post, @post.tags.build]) do |f| %> 
    <%= f.label 'tag' %> 
    <%= f.text_area :name %> 
    <%= f.submit %> 
<% end %> 

<% current_user.pictures.each do |p| 
<%= form_for([p, p.tags.build], :remote => true) do |f| %> 
    <%= f.text_area :name %> 
    <%= f.submit 'add tag' %> 
<% end %> 
<% end %> 
在我TagsController

def tag_post 
    authenticate_user! 
    @post = Post.find(params[:id]) 
    @tag = @post.tags.build(params[:tag]) 
    @tag.save 
    redirect_to edit_post_path(@post) 
end 

def tag_picture 
    authenticate_user! 
    @picture = Picture.find(params[:id]) 
    @tag = @state.picture.build(params[:tag]) 
    @tag.save 
      redirect_to edit_picture_path(@picture) 
end 

的routes.rb:

post '/posts/:id/tags' => 'tags#tag_post', :as => :tag_post 
post '/flow/:id/tags' => 'tags#tag_picture', :as => :tag_picture 

耙路線:

    posts GET /posts(.:format)       posts#index 
         POST /posts(.:format)       posts#create 
       new_post GET /posts/new(.:format)      posts#new 
       edit_post GET /posts/:id/edit(.:format)     posts#edit 
        post GET /posts/:id(.:format)      posts#show 
         PUT /posts/:id(.:format)      posts#update 
         DELETE /posts/:id(.:format)      posts#destroy 
     new_user_session GET /users/sign_in(.:format)     devise/sessions#new 
      user_session POST /users/sign_in(.:format)     devise/sessions#create 
    destroy_user_session DELETE /users/sign_out(.:format)     devise/sessions#destroy 
      user_password POST /users/password(.:format)     devise/passwords#create 
     new_user_password GET /users/password/new(.:format)    devise/passwords#new 
     edit_user_password GET /users/password/edit(.:format)    devise/passwords#edit 
         PUT /users/password(.:format)     devise/passwords#update 
cancel_user_registration GET /users/cancel(.:format)      devise/registrations#cancel 
     user_registration POST /users(.:format)       devise/registrations#create 
    new_user_registration GET /users/sign_up(.:format)     devise/registrations#new 
    edit_user_registration GET /users/edit(.:format)      devise/registrations#edit 
         PUT /users(.:format)       devise/registrations#update 
         DELETE /users(.:format)       devise/registrations#destroy 
        root  /           flow#flow 
        root  /           flow#home 
      posts_index GET /ramblin(.:format)       posts#index 
       post_tags POST /posts/:id/tags(.:format)     tags#tag_post 
       picture_tags POST /flow/:id/tags(.:format)     tags#tag_picture 
      create_picture POST /flow(.:format)        pictures#create 
        search POST /flow/search(.:format)      flow#flow 
+0

post_idpicture_id屬性請運行'耙routes',給我們增加了輸出 – weltschmerz 2013-02-13 20:02:32

+0

耙路線在問題的底部。 – deakolt 2013-02-13 20:14:06

回答

1

的問題是

validates :name, :uniqueness => { :sscope => :post_id } 
    validates :name, :uniqueness => { :scope => :picture_id } 

,因爲這些方法需要tag模式對存儲在posts_tags

+0

非常感謝。有了這種理解,似乎沒有辦法使用內置的Rails驗證來進行這種驗證?我會寫一個自定義驗證 - – deakolt 2013-02-13 21:59:38

1

看一看運行rake routes進行輸出的路線。有這一行:

post_tags POST /posts/:id/tags(.:format) tags#tag_post 

這表明你該路徑必須是posts(複數),而不是post(單數)。

所以,你應該將張貼到

/posts/1/tags 

順便說一句,我知道你說你正在學習Rails的,所以它的偉大,你是從頭開始建立一個標籤系統 - 但後來你可能希望有看看這個真棒寶石acts as taggable on。這是超級簡單和樂趣。這是一個rails casts,非常好地覆蓋標籤。

+0

謝謝!雖然這不是直接的問題,但我的代碼仍然是一個問題,我刪除了。謝謝!!並感謝您對'作爲標籤的行爲'的建議,我看到那個寶石,但像你說的那樣認爲從頭開始實施標籤將是一個有用的學習設備:) – deakolt 2013-02-13 22:00:21