【问题标题】:How do I pass form variables from views to controllers in Rails 4?如何将表单变量从视图传递到 Rails 4 中的控制器?
【发布时间】:2015-01-16 09:59:57
【问题描述】:

我正在尝试以简单的形式接受电话号码,但我似乎无法将变量传递给控制器​​。我到目前为止的代码是:

查看 /users/new.erb:

<%= form_for @user do |f| %>

  <%= field_set_tag do %>

    <p><%= f.label :phone %><br>

       <%= f.text_field :phone%>

    <%= f.submit "Submit" %>

  <% end %>

<% end %>

在我的控制器中:

def new
   @user = User.new
end

def create
  @user = User.new(params[:new])
  phone = @user.phone
end

任何帮助将不胜感激。谢谢。

【问题讨论】:

    标签: forms ruby-on-rails-4 controller views parameter-passing


    【解决方案1】:

    您的代码存在一些问题。当你写:

    <%= form_for @user %>
    

    所有表单字段都以“user”为根的哈希形式发送到控制器。就像

    {"user": {"phone": "ENTERED PHONE NUMBER"}}
    

    要访问控制器中的这些字段,您需要使用以下方法:

    @phone_number = params[:user][:phone] 
    

    一件更重要的事情

    出于安全目的,rails 确实使用了强参数。这意味着您不能直接在 Active Model 中使用表单参数进行质量分配,如下所示:

    @user = User.new(params[:user])
    

    您需要明确允许所有字段进行批量分配。这可以通过以下方式实现。

    def create
      @user = User.new(params_user)
      @user.save
    end
    
    private 
    def params_user
      params.require(:user).permit(:phone)
    end
    

    【讨论】:

      【解决方案2】:

      params[:new] 只是将参数:new 传递给您的@user 对象,但没有params[:new] 参数,因为它没有在您的表单中定义。如果您想要提交的所有可用参数,params[:phone] 应仅传递给“@user”参数。

      试试

      @user = User.new(params) #instead of @user = User.new(params[:new])
      
      @user.phone
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-10-28
        • 1970-01-01
        • 2011-09-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多