2014-10-30 58 views
0

我有一個用戶模型和一個ArtworkIteration模型。用戶可以創建ArtworkIterations。ActiveRecord協會只在控制檯工作

我的用戶模型有很多artwork_iterations

class User < ActiveRecord::Base 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 
    has_many :artwork_iterations 
end 

而且我artwork_iterations belongs_to的用戶

class ArtworkIteration < ActiveRecord::Base 
    belongs_to :user 
end 

這裏的它增加了USER_ID外鍵我artwork_iteration模型遷移

class AddUserIdToArtworkIterations < ActiveRecord::Migration 
    def change 
    add_column :artwork_iterations, :user_id, :integer 
    add_index :artwork_iterations, :user_id 
    end 
end 

當我在rails控制檯中創建一個artwork_iteration時,它的作用是:

> @art = ArtworkIteration.create(user_id: User.last.id) 
> @art.user 
# Successfully returns the last user 

但是當我通過我的網站創建一個artwork_iteration登錄時,artwork_iteration.user爲null。

爲了解決這個問題我已經添加了一個隱藏字段我的表格:

<%= f.hidden_field :user_id, value: "#{current_user.id}" %> 

但這似乎哈克,是非常不安全的。 (任何用戶都可以檢查元素並更改此值,使他們可以以不同用戶的身份創建artwork_iterations)。

回答

2

你可能知道答案,只是沒有意識到它。我們需要最有可能看到您的控制器和路由,但是在控制檯中清楚地指定了user_id。在你的網站上你顯然不是。如果你已經在你的路線中的用戶下嵌套了artwork_iterations,你必須在你的控制器中有一件事物用於新建和創建,如果你不需要另一個。

如果是嵌套的,在你的artwork_iterations控制器,你需要以下before_action頂部:

before_action :get_user 

然後在底部,你需要這樣的私有方法:

def get_user 
    @user = User.find(params[:user_id]) # (or current_user as you seem to have that helper) 
end 

這將傳遞localhost/user/1/artworkiterations /新頁面的參數,以便用戶匹配登錄的用戶。如果你有Devise或者「current_user」方法,你可以在這裏使用current_user。

我打算假設你已經嵌套了它,但是無論如何,你必須實際聲明誰是新用戶,並在artwork_iterations控制器中創建動作。這樣的:

def new 
    @artworkiteration = @user.artwork_iterations.build 
end 

這樣的東西可能適合你。

+0

謝謝!爲此,使用devise的current_user.id結束。我目前在artwork_iterations.create後面設置了id值 – 2014-10-30 06:47:57