我希望每个用户在注册时上传个人资料图片。我有两个模型,一个用户模型和一个图像模型。那么我应该如何使用新用户更新用户模型,以及为具有一个表单的用户创建带有新图像的图像模型?
用户模型
class User < ActiveRecord::Base
has_one :profile_image, class_name: 'Image', foreign_key: 'user_id'
end
图片模型
class Image < ActiveRecord::Base
# do I need to put something else here to make this relationship work?
end
用户/新视图
<%= form_for(@user) do |f| %>
<%= f.label :email %><br>
<%= f.text_field :email %>
<%= f.label :password %><br>
<%= f.password_field :password %>
# this needs to update a seperate params hash, but how?
<%= f.file_field :profile_image %>
<%= f.label :password_confirmation %><br>
<%= f.password_field :password_confirmation %>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
用户#create action
def create
@user = User.new(user_params)
respond_to do |format|
if @user.save
# save their uploaded image
Image.create() # help needed here!
sign_in @user
format.html { redirect_to @user, notice: 'Welcome, ' + @user.user_name + '!' }
format.json { render action: 'show', status: :created, location: @user }
else
format.html { render action: 'new' }
format.json { render json: @user.errors, status: :unprocessable_entity }
end
end
end
private
# how do I create a method to require certain parameters for the Image?
def user_params
params.require(:user).permit(:email, :password, :password_confirmation, :profile_image)
end
现在我实际上已经完成了在文件系统中创建图像的难点(通过rmagick),简单的一点,只需使用有关此图像的信息更新images
表,就是我在努力的地方!
我也知道嵌套表单,但我认为新图像和新用户都应该在users#create
操作中创建。它使得查看正在发生的事情变得容易得多,而不是图像是在自己的image#create
动作中创建的。我还想把用户创建和图像创建放在一个事务块中,但如果它们都发生在自己的行为中,这是不可能的,所以我认为答案是将一个表单分成两个参数哈希并用第一个哈希,然后使用第二个哈希做其他事情。
答案 0 :(得分:0)
使用accepts_nested_attributes_for,起初有点难以弄清楚,但在这种情况下,它正是您需要的。像这样:
user.rb:
class User < ActiveRecord::Base
has_one :profile_image, class_name: 'Image', foreign_key: 'user_id'
accepts_nested_attributes_for :profile_image
end
观点:
<%= f.fields_for :profile_image do |f| %>
<%= file_field :file %>
<% end %>
控制器似乎已全部设定。