【问题标题】: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