Ruby on rails ActiveRecord关联仅在控制台中工作

Ruby on rails ActiveRecord关联仅在控制台中工作,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我有一个用户模型和一个ArtWorkeration模型。用户可以创建艺术作品 我的用户模型有很多迭代 class User < ActiveRecord::Base devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable has_many :artwork_iterations end 但当我在登录时通过我的站点创

我有一个用户模型和一个ArtWorkeration模型。用户可以创建艺术作品

我的用户模型有很多迭代

class User < ActiveRecord::Base
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable
  has_many :artwork_iterations
end
但当我在登录时通过我的站点创建artwork_迭代时,artwork_迭代.user为空

为了解决这个问题,我在表单中添加了一个隐藏字段:

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


但这似乎有点骇人听闻,而且非常不安全。(任何用户都可以检查元素并更改此值,让他们以其他用户的身份创建artwork\u迭代)。

您可能知道答案,只是没有意识到而已。我们很可能需要查看您的控制器和路由,但是,在控制台中,您可以清楚地分配用户id。在你的网站上,你显然不是。如果在路线中已将artwork_迭代嵌套在user下,则控制器中必须有一个东西用于新建和创建,如果没有,则必须有另一个

如果嵌套,在artwork_iterations控制器的顶部,您需要执行以下操作:

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/new页面的参数,以便用户与登录用户匹配。如果您有Desive或“current_user”方法,您可以在此处使用current_user

我将假设您已经嵌套了它,但是,无论哪种方式,您都必须在artwork_迭代控制器中实际声明新的用户并创建操作。以便:

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

像这样的东西可能对你有用。

谢谢!最终为此使用Desive的当前_user.id。我目前正在艺术品_iterations.create之后设置id值
before_action :get_user
def get_user
  @user = User.find(params[:user_id]) # (or current_user as you seem to have that helper)
end
def new
  @artworkiteration = @user.artwork_iterations.build
end