如何将表单变量从视图传递到Rails 4中的控制器?

时间:2015-01-16 09:59:57

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

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

在/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

非常感谢任何帮助。感谢。

2 个答案:

答案 0 :(得分:2)

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

<%= 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

答案 1 :(得分:0)

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

尝试

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

@user.phone