2015-05-18 131 views
0

我試圖在我的網站上實現「設置」頁面。在此頁面中,用戶可以更改一些基本設置,例如他們的電子郵件和訂閱電子郵件。現在,我只是想讓他們能夠取消訂閱電子郵件。首次註冊時,他們可以選擇複選框,並將值存儲在mysql數據庫中。現在,我很難弄清楚如何從不同的頁面進行更改。 這裏是簽署了貌似控制器:Rails - 將視圖中的參數傳遞給控制器​​

class SignUpsController < ApplicationController 

    def index  
    end 

    def new 
    @user = SignUp.new 
    end 

    def cost 
    return 10 
    end 

    def create 

    @user = SignUp.new(sign_ups_params) 

    if @user.save! 
     UserMailer.welcome_email(@user).deliver 

     flash[:notice] = "Thank you " + @user.first_name + ", account created  successfully." 
     redirect_to(:controller => 'home') 

    else 
     flash[:error] = "something failed" 
     redirect_to :back 
    end 
    rescue 
    flash[:error] = "Failed to create user, email is taken or passwords do  not match" 
    redirect_to :back 
    end 

    private 
    def sign_ups_params 
    params.require(:sign_ups).permit(:first_name, :last_name, :email,  :password, :password_confirmation, :subscription) 
    end 
end 

下面是註冊頁面,顯示我如何着手填寫並提交表單一個視圖的一部分:

<h3>Create New User</h3> 

    <%= form_for(:sign_ups, :url => {:action => 'create'}) do |f| %> 

    <table summary="Subject form fields"> 
     <tr> 
     <th>First Name</th> 
     <td><%= f.text_field(:first_name) %></td> 
     </tr> 
     <tr> 
     <th>Last Name</th> 
     <td><%= f.text_field(:last_name) %></td> 
     </tr> 
     <tr> 
     <th>Email</th> 
     <td><%= f.email_field(:email) %></td> 

     </tr> 
     <tr> 
     <th>Password</th> 
     <td><%= f.password_field(:password) %></td> 
     </tr> 
     <tr> 
     <th>Password Conformation</th> 
     <td><%= f.password_field(:password_confirmation) %></td> 
     </tr> 
     <tr> 
     <th>Subscribe to email</th> 
     <td><%= f.check_box(:subscription) %></td> 
     </tr> 

    </table> 
    <input class="btn btn-primary" name="commit" type="submit" value="Create User"/> 
    </div> 

我已經爲設置頁面創建了一個「配置文件」視圖和控制器,但不知道這是否是正確的方式,或者如果我只是使用註冊控制器。 提前謝謝!

+0

您是否在尋找只更新一些特定用戶信息的方法? –

+0

@FrancescoPirrone是的,我是 –

回答

1

您可以並且應該使用您的signups_controller,因爲您想讓用戶能夠編輯他的註冊記錄(或註冊)。

你只需要添加一些東西來完成這項工作。首先,在控制器的editupdate行動:

def edit 
    @user = SignUp.find(params[:id]) 
end 

def update 
    @user = SignUp.find(params[:id]) 
    respond_to do |format| 
    if @user.update(sign_up_params) 
     # do this 
    else 
     # do that 
    end 
    end 
end 

而且重命名sign_ups_params其單數形式=>sign_up_params

而且你相應的視圖

views/sign_ups/edit.html.erb 
<%= render 'form' %> 

views/sign_ups/_form.html.erb 
<%= form_for(@user, :url => {:action => 'update'}) do |f| %> 
.... 

,因爲你可能有resources :sign_ups在你的config/routes.rb中,你應該很好走。


從分隔條件的ProfileSignUp可能使生活難度比它必須是,除非你使用像設計一個寶石(這是做)的一個非常乾淨的方式。

您試圖更新哪個對象,或者哪個對象包含要更新的屬性?

如果要更新sign_up_params,請在您的SignUpsController中執行此操作,並將您的update操作添加爲您得到的建議中的錯誤。 但是,如果您需要更新profile_params,請在ProfilesController中執行此操作。

現在你可能會看到混亂。考慮自己正在查看某人的elses代碼,看到ProfilesController以及SignUpsControllercreate操作。

爲什麼不只有一個ProfilesController,其中sign_up是Profile對象的創建操作?

如果你保留這個在你的SignUpsController移動edit以及update那裏。

+0

爲了清楚起見,我是否應該在SignUp控制器或Profile Controller中添加編輯和更新方法?因爲我試圖將它們添加到SignUp控制器,但是當我創建表單時,我收到錯誤消息「無法找到ProfileController的操作'更新'。」 –

+0

我已更新答案 –

+0

我明白你的意思了。我想更新sign_up_params。我應該在配置文件視圖中通過執行form_for(:sign_ups,:url => {:action =>'update'})來引用SignUpsController,並在SignUpsController中添加'update'方法嗎?然後我不需要ProfileController。 –

相關問題