我有一个User模型和一个ArtworkIteration模型。用户可以创建ArtworkIterations。
我的用户模型有许多艺术重复
class User < ActiveRecord::Base
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
has_many :artwork_iterations
end
我的艺术作品_重复下面的内容_给用户
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_interation.user为null。
为了解决这个问题,我在表格中添加了一个隐藏字段:
<%= f.hidden_field :user_id, value: "#{current_user.id}" %>
但这似乎很不礼貌,而且极不安全。(任何用户都可以检查元素并更改此值,从而允许他们以不同用户的身份创建artwork_iterions)。
您可能知道答案,但没有意识到。我们很可能需要查看您的控制器和路由,但在控制台中,您可以清楚地分配user_id。在你的网站上,你显然不是。如果您在路由中的user下嵌套了artwork_iterions,则必须在控制器中有一个用于新建和创建的东西,如果没有,则必须有另一个。
如果您是嵌套的,那么在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/new页面的参数,以便用户与登录的用户匹配。如果你有Devise或"current_user"方法,你可以在这里使用current_user。
我假设您已经嵌套了它,但无论哪种方式,您都必须声明新用户的身份,并在artwork_iterations控制器中创建操作。这样:
def new
@artworkiteration = @user.artwork_iterations.build
end
这样的东西可能对你有用。