2013-10-17 76 views
1

我很難闡明我面臨的確切問題,但我會嘗試一個簡短的說明和代碼。2意見1表格RoR

我想添加一個功能到一個簡單的現有的應用程序,允許用戶裁剪上傳的圖像的頭像。我在相同的視圖上做文件選擇,允許用戶更新他們的密碼和其他各種帳戶選項。用戶提交該表單,然後呈現裁剪功能的視圖。問題在於從裁剪視圖中提交失敗,因爲它無法驗證上一個表單中的參數。基本上我希望所有表格都是在同一時間提交,但從兩個不同的角度提交。

user.rb

class User < ActiveRecord::Base 
    attr_accessible :name, :email, :password, :password_confirmation, :avatar, 
         :crop_x, :crop_y, :crop_w, :crop_h 

    validates :name, presence: true, length: { maximum: 50 } 
    VALID_EMAIL_REGEX = /\A[\w+\-.][email protected][a-z\d\-.]+\.[a-z]+\z/i 
    validates :email, presence: true, format: { with: VALID_EMAIL_REGEX }, 
        uniqueness: { case_sensitive: false } 
    validates :password, presence: true, length: { minimum: 6 } 
    validates :password_confirmation, presence: true 

    mount_uploader :avatar, AvatarUploader 
    attr_accessor :crop_x, :crop_y, :crop_w, :crop_h 
    after_update :crop_avatar 

    def crop_avatar 
    avatar.recreate_versions! if crop_x.present? 
    end 
end 

我已經嘗試了幾種不同的東西來解決這個問題。我相信我錯過了一個基本概念。有任何想法嗎?

users_controller.rb

def update 
    @user = User.find(params[:id]) 
    if @user.update_attributes(params[:user]) 
    if params[:user][:avatar].present? 
     render 'crop' 
    else 
     sign_in @user 
     redirect_to @user, notice: "Successfully updated user." 
    end 
    else 
    render 'edit' 
    end 
end 

edit.html.erb

<% provide(:title, "Edit user") %> 
<h1>Update your profile</h1> 

<div class="row"> 
    <div class="span6 offset3"> 
    <%= form_for @user, :html => {:multipart => true } do |f| %> 
     <%= render 'shared/error_messages', object: f.object %> 

     <%= f.label :avatar %> 
     <%= f.file_field :avatar %> 

     <%= f.label :name %> 
     <%= f.text_field :name %> 

     <%= f.label :email %> 
     <%= f.text_field :email %> 

     <%= f.label :password %> 
     <%= f.password_field :password %> 

     <%= f.label :password_confirmation, "Confirm Password" %> 
     <%= f.password_field :password_confirmation %> 

     <%= f.submit "Save changes", class: "btn btn-large btn-primary" %> 
    <% end %> 
    </div> 
</div> 

crop.html.erb

<% provide(:title, 'Crop Avatar') %> 
<h1>Crop Avatar</h1> 

<div class="row"> 
    <div class="span6 offset3"> 
    <%= image_tag @user.avatar_url(:large), id: "cropbox" %> 

    <h4>Preview</h4> 
    <div style="width:100px; height:100px; overflow:hidden"> 
     <%= image_tag @user.avatar.url(:large), :id => "preview" %> 
    </div> 

    <%= form_for @user do |f| %> 
     <% %w[x y w h].each do |attribute| %> 
     <%= f.hidden_field "crop_#{attribute}" %> 
     <% end %> 
     <div class="actions"> 
     <%= f.submit "Crop" %> 
     </div> 
    <% end %> 
    </div> 
</div> 
+1

您可以嘗試在crop.html.erb中創建幾個隱藏的輸入,並將其複製到edit.html.erb中,並使用@user屬性填充它們? –

+0

感謝您的回覆。這工作。我擔心這可能不是最佳做法,因爲頁面的源代碼包含密碼信息。你對此有何看法? – s0dz

+0

我需要更多信息。關於密碼...您是否使用Devise進行身份驗證? –

回答

1

你可以不是H一個行動2個意見。第二個想法是,爲什麼你需要它,我的意思是你只在params [:user] [:avatar]存在的時候纔會渲染,只有當你提交你的edit.html.erb模板時纔會調用它。我認爲你可以做的是在控制器中使用名稱裁剪的另一種方法,並用指定的維度更新用戶的頭像。