2017-03-14 102 views
0

我對何時使用隱藏字段感到困惑。Rails:隱藏字段的最佳實踐

我試圖提交表單時傳遞USER_ID,除了:

<%= f.hidden_field :user_id %> 

但是,我知道這是不對的。我已經將模型設置爲屬於用戶,但據我所知,不會自動分配ID。

有人能指出我正確的方向嗎?

編輯:謝謝大家的迴應。正如我之前所說的,我知道你不應該使用hidden_​​field來處理像ID這樣重要的事情。按照鏈接@ brad-werth的帖子,批量分配太容易了。

我正在添加代碼,以使其更容易回答。我需要提交下面的表格,並確保它已分配給用戶。而且,是的,我使用的設計:

votes_controller.rb

class VotesController < ApplicationController 
    before_action :set_vote, only: [:show, :edit, :update, :destroy] 

# GET /votes 
# GET /votes.json 
def index 
    @votes = Vote.for_user(current_user).where(nil) 
end 

# GET /votes/1 
# GET /votes/1.json 
    def show 
    redirect_to action: "index" 
    end 

# GET /votes/new 
def new 
    @vote = Vote.new 

    if @vote.save 
    user_id = current_user.id 
    else 
    render 'new' 
    end 
end 

_form.html.erb

<%= form_for(vote) do |f| %> 
    <% if vote.errors.any? %> 
    <div id="error_explanation"> 
     <h2><%= pluralize(vote.errors.count, "error") %> prohibited this vote from being saved:</h2> 

     <ul> 
     <% vote.errors.full_messages.each do |message| %> 
      <li><%= message %></li> 
     <% end %> 
     </ul> 
    </div> 
    <% end %> 

<div class="field"> 
    <%= f.label :widget %> 
    <%= f.text_field :widget_name, data: {autocomplete_source: widgetnames_path} %> 
</div> 

<div class=""> 
    <!-- description will go here --> 
</div> 

<div class="field"> 
    <%= f.label :originality %> 
    <%= f.number_field :originality %> 
</div> 

<div class="field"> 
    <%= f.label :interest %> 
    <%= f.number_field :interest %> 
</div> 

<div class="field"> 
    <%= f.label :rating %> 
    <%= f.number_field :rating %> 
</div> 

<div class="field"> 
    <%= f.label :comments %> 
    <%= f.text_field :comments %> 
</div> 

<div class="actions"> 
    <%= f.submit %> 
</div> 
<% end %> 
+0

您能否給您正在使用 – Sajin

+0

喜形式更多詳情,歡迎到堆棧溢出。你能否提供一些支持代碼,例如控制器動作(既呈現表單又接受提交的值)。你在哪裏決定使用哪個用戶ID?你可以提供更多的「表格」,以便我們可以看到它是什麼形式*爲*等 –

+0

http://stackoverflow.com/questions/5163775/is-the-use-of-hidden-fields-in -forms-insecure –

回答

0

假設你的路由是這個樣子:

resources :users do 
    resources :votes 
end 

...你處理,看起來像這樣的路徑:

/users/:user_id/votes 

...這路線VotesController

如果您發送POST請求到該路徑,Rails會將其路由到VotesController#create操作。這個動作可以通過params對象訪問user_id參數中的URL通過,所以你的行動可以做這樣的事情:

def create 
    @vote = Vote.new(vote_params) 
    if @vote.save 
    redirect_to user_path(@vote.user_id), notice: :success 
    else 
    render :new 
    end 
end 

def vote_params 
    params.require(:vote).permit(:user_id, :vote_value) 
end 
protected :vote_params 

但是,如果一投不用戶,但仍然belongs_to用戶,你可能有以下途徑:

resources :votes 

...這看起來像這樣的路徑:

/votes 

...路由到您的VotesController。在這種情況下,當你到這個URL的POST,你沒有user_id參數,但你有一個會話對象與認證的代理用戶的方式。

在這種情況下,你的控制器方法可能是這個樣子:

def create 
    @vote = Vote.new(vote_params.merge(user_id: current_user.id)) 
    if @vote.save 
    redirect_to some_other_path, notice: :success 
    else 
    render :new 
    end 
end 

def vote_params 
    params.require(:vote).permit(:vote_value) 
end 
protected :vote_params 
-1

的關係模型不具有attribue user_ID的,所以你不能使用這樣的:

<%= f.hidden_field :user_id %> 

如果您需要提交USER_ID,嘗試hidden_​​field_tag,例如:

<%= hidden_field_tag :user_id, @user.id %> 
-1

您需要給它一個值。你可以在你的控制器中設置它。

<%= f.hidden_field :user_id, value: @user.id %> 
    or 
<%= f.hidden_field :user_id, value: params[:user_id] %> 
1

如果您有關聯,則可以在User上建立關聯。

current_user.build_profile(profile_params) 

這將自動分配user_id並且您不需要發送任何隱藏字段。

hidden_field的問題是,如果我更改該字段的值,則模型或控制器無法識別該字段。

+0

嘿@ deepak-mahakale,你可以在這裏詳細說明你的代碼嗎?你正在創建一個名爲build_profile的方法嗎? – Creedian

+0

您無法控制用戶更改動作url中的ID。別躲在錯誤的安全之後。 – coreyward

+0

@coreyward'current_user'通常是身份驗證的結果,而不是url中的一個id。在這種情況下,這種解決方案似乎是解決確保只對當前用戶進行修改的理想方法......它與'Vote.new(vote_params.merge(user_id:current_user.id))'方法非常類似, ,但從用戶的角度來看,不是投票。 –

-1

只需添加到已經收到的答案,如果你使用的是gem像色器件,你可以做這樣的事情:

<%= f.hidden_field :user_id, value: current_user.id %> 

更多信息here有關如何使用hidden_​​field標籤。