2014-10-30 54 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