2013-01-06 30 views
0

我是一名Rails新手,遇到了一個我無法超越的問題。我已經找遍了所有,但無法找到一個有效的答案。我有一個允許用戶友誼的應用程序。這部分工作得很好。不過,我最近通過將朋友圈入圈子(有點像Google+)爲友誼添加了另一個級別。我遇到的問題是圓圈沒有保存在數據庫中。下面就來看看發生了什麼:ID未保存在Rails中

Processing by UserFriendshipsController#create as HTML 
Parameters: {"utf8"=>"✓", "authenticity_token"=>"cupb6S+IdrxqSuEqgfqehJh++POHUMQQ9QqbQVrGtHk=", "user_friendship"=>{"circle_id"=>"9", "friend_id"=>"jimbo"}, "commit"=>"Yes, Add Friend"} 
User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1 
User Load (0.1ms) SELECT "users".* FROM "users" WHERE "users"."profile_name" = 'jimbo'  LIMIT 1 
(0.0ms) begin transaction 
SQL (0.7ms) INSERT INTO "user_friendships" ("circle_id", "created_at", "friend_id", "state", "updated_at", "user_id") VALUES (?, ?, ?, ?, ?, ?) [["circle_id", nil], ["created_at", Sun, 06 Jan 2013 17:40:30 UTC +00:00], ["friend_id", 2], ["state", "pending"], ["updated_at", Sun, 06 Jan 2013 17:40:30 UTC +00:00], ["user_id", 1]] 
SQL (0.2ms) INSERT INTO "user_friendships" ("circle_id", "created_at", "friend_id", "state", "updated_at", "user_id") VALUES (?, ?, ?, ?, ?, ?) [["circle_id", nil], ["created_at", Sun, 06 Jan 2013 17:40:30 UTC +00:00], ["friend_id", 1], ["state", "requested"], ["updated_at", Sun, 06 Jan 2013 17:40:30 UTC +00:00], ["user_id", 2]] 

這裏的形式:

<%= simple_form_for @user_friendship, method: :post do |f| %> 
<div class="form-inputs"> 
    <%= f.collection_select :circle_id, current_user.circles.all(:order => 'name'), :id, :name %> 
</div> 
<div class="form form-actions"> 
    <%= f.hidden_field :friend_id, value: @friend.profile_name %> 
    <%= f.button :submit, "Yes, Add Friend", class: 'btn btn-primary' %> 
    <%= link_to "Cancel", profile_path(@friend), class: 'btn' %> 
</div> 
<% end %> 

這裏有關聯:

class UserFriendship < ActiveRecord::Base 
    belongs_to :circle 

class Circle < ActiveRecord::Base 
    has_many :friends, through: :user_friendships 

圓圈用戶到達表單之前已創建。我已經通過遷移將circle_id添加到了user_friendships表中,因此有一個ID可以保存。對於我的生活,我無法弄清楚這裏出了什麼問題。形式上沒有錯誤,友誼仍然只能保存在圈子裏。我可能做錯了什麼?

(讓我知道如果你需要更多的信息)

編輯 這裏的控制器動作

def create 
    if params[:user_friendship] && params[:user_friendship].has_key?(:friend_id) 
    @friend = User.where(profile_name: params[:user_friendship][:friend_id]).first 
    @user_friendship = UserFriendship.request(current_user, @friend) 
    if @user_friendship.new_record? 
     flash[:error] = "There was problem creating that friend request." 
    else 
     flash[:success] = "Friend request sent." 
    end 
    redirect_to profile_path(@friend) 
    else 
    flash[:error] = "Friend required" 
    redirect_to root_path 
    end 
end 

這裏的user_friendships表:

create_table "user_friendships", :force => true do |t| 
    t.integer "user_id" 
    t.integer "friend_id" 
    t.datetime "created_at", :null => false 
    t.datetime "updated_at", :null => false 
    t.string "state" 
    t.integer "circle_id" 
    end 

    add_index "user_friendships", ["circle_id"], :name => "index_user_friendships_on_circle_id" 
    add_index "user_friendships", ["state"], :name => "index_user_friendships_on_state" 
    add_index "user_friendships", ["user_id", "friend_id"], :name => "index_user_friendships_on_user_id_and_friend_id" 

這裏請求的方法:

def self.request(user1, user2) 
    transaction do 
     friendship1 = create!(user: user1, friend: user2, state: 'pending') 
     friendship2 = create!(user: user2, friend: user1, state: 'requested') 

     friendship1.send_request_email 
     friendship1 
    end 
    end 
+0

發佈控制器操作代碼... –

+0

表'user_friendships'的schema schema.rb文件。數據庫中設置了id autoincrement嗎? –

+0

@PhilipHallstrom - 添加了控制器操作。 –

回答

1

爲什麼它不保存circle_id的簡單答案是你永遠不會使用它。

從你告訴我們的日誌信息,它就會出現,params[:user_friendship][:circle_id]

但你永遠不會做這種事。

我建議以下變化

def self.request(user1, user2, circle) 
    transaction do 
    friendship1 = create!(user: user1, friend: user2, state: 'pending', circle: circle) 
    friendship2 = create!(user: user2, friend: user1, state: 'requested', circle: circle) 

    friendship1.send_request_email 
    friendship1 
    end 
end 

然後從控制器

+0

我按照你的建議試過了,但'circle_id'仍然沒有保存。 –

+0

@BenReilly你需要調整控制器動作,並查找Circle或者調整Matthew的方法來直接使用circle_id。 –

+0

我試過調整控制器,但沒有運氣。通常我收到錯誤「無法找到沒有ID的圓圈」。我將如何通過控制器中的現有圓圈? –

0

我覺得參數得到了作爲PARAMS在傳遞[:user_friendship] [:CIRCLE_ID]和檢查,如果你是使用此參數保存circle_id。同時檢查從視圖中獲取的circle_id是否爲「整數」類型。

+0

感謝您的幫助,但我仍然得到一個錯誤'錯誤數量的參數(2爲3)' 。 –