2014-03-18 30 views
0

爲了讓用戶使用我的搜索表單,他們鍵入用戶的名字,按下submit鍵,然後rails打開該用戶的主頁。我仍然是初學者,當我在搜索框中輸入用戶名「test」時,用戶到達的「主頁」是對GET指向URL http://localhost:3000/center/show_user?utf8=%E2%9C%93&name=test&commit=Search的方法的迴應。使用表格附加默認參數

在控制器動作center#show_user,我已設置@user = User.find_by(name: params[:name]) 並在視圖,它與<%= @user.name %>顯示良好。

我想在center#show_user頁面上創建一個表格來創建一個新的「項目」。項目在屬於用戶的方案中定義,用戶被定義爲擁有多個項目(用戶具有item_id列,項目具有user_id列)。

當這個表單被提交時,我如何包含當前的user_id,從承載表單的頁面上的url中的params繼承?例如,如果我轉到名爲「sample_user」的用戶頁面,我希望能夠提交「新項目」表單並將user_id自動包含在該表單中。


'中央' 這個頁面控制器代碼

def show_user 
    @user = User.find_by(name: params[:name]) 
end 

回答

0

只需添加

<%= hidden_field_tag "user_id", current_user.id %> 

形成。

+0

好的,謝謝。這是我最初的傾向,但我不確定它會安全。這會對有人改變這個領域的價值感到脆弱嗎? – user3432433

+0

也我沒有current_user定義 – user3432433

+0

權利,可以改變該字段的值。相反,您應該通過控制器中的任何方式訪問用戶標識。 –

0

您應該通過與用戶的關係創建「項目」。這意味着:

在用戶模型給出這樣的:

class User < ActiveRecord::Base 
    has_many :items 
end 

不要在控制器中執行以下:

def create 
    @user = User.find_by(name: params[:name]) 
    @user.items.create(params[:item]) 
    # redirect_to or something different... 
end 

這將自動爲您構建(關係在user_id領域基本上填充爲你)。這樣做的原因是用戶不能混淆你的表單並在隱藏字段中填寫其他用戶標識符。

+0

我得到了'nil:NilClass'的'undefined method'項目'def create_item @user = User.find_by(name:params [:name]) @ user.items.create(params [:item ]) \t redirect_to'root' end' – user3432433

+0

它無法找到用戶。這可能是因爲你沒有'name'參數可用。在每個請求中傳遞用戶名稱會引發一些紅旗,因爲通常您不希望人們能夠更改其他用戶。在沒有身份驗證的情況下在參數中傳遞它並不安全。 – iain

+0

但是,如果你仍然想要這樣做,請確保將name參數添加到要發佈到的url中。所以像這樣:'<%= form_for @item,url:item_path(name:@ user.name)do | f | %>' – iain