从一个表单创建两个哈希

时间:2014-03-30 21:09:41

标签: ruby-on-rails

我希望每个用户在注册时上传个人资料图片。我有两个模型,一个用户模型和一个图像模型。那么我应该如何使用新用户更新用户模型,以及为具有一个表单的用户创建带有新图像的图像模型?

用户模型

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动作中创建的。我还想把用户创建和图像创建放在一个事务块中,但如果它们都发生在自己的行为中,这是不可能的,所以我认为答案是将一个表单分成两个参数哈希并用第一个哈希,然后使用第二个哈希做其他事情。

1 个答案:

答案 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 %>

控制器似乎已全部设定。