2017-03-14 96 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标签。