1

我是 Ruby on Rails 和 Web 开发的新手,当我遇到一个非常混乱的代码时,我正在关注 Michael Hartl 在 youtube 上的 rails 教程。代码是:

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

我只是不明白 ":user" 键的来源或它的价值是什么。我一直在尝试阅读有关 ruby​​ 中符号和哈希的所有信息,但这让我更加困惑。起初教程中有这段代码:

def show
@user = User.find(params[:id])
@title = @user.name
end

其中我知道“params [:id]”是一个带有键值的哈希:id,其中:id =>(数据库中的id)但是使用params [:user],我迷路了。我没有“用户”的任何列,但我的模型名为“用户”。

因此,我的简单问题是......密钥“:user”来自哪里,它的价值是什么?

4

3 回答 3

1

它来自你的表格

= form_for(@user, :url =>  url) do |f|
  = render 'shared/error_explanation', :object => @user

  = f.label t('users.email')
  = f.text_field :email, :autocomplete => 'off'

  = f.label t('users.password')
  = f.password_field :password, :autocomplete => 'off'

  = f.label t('users.password_confirmation')
  = f.password_field :password_confirmation, :autocomplete => 'off'

  %br

  = f.submit :class => 'btn'

它产生类似的东西

<form accept-charset="UTF-8" action="/users/create_by_admin" id="new_user" method="post"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="&#x2713;" /><input name="authenticity_token" type="hidden" value="xxx=" /></div>  
  <label for="user_Email">Email</label>
  <input autocomplete="off" id="user_email" name="user[email]" size="30" type="text" value="" />

  <label for="user_password">password</label>
  <input autocomplete="off" id="user_password" name="user[password]" size="30" type="password" />

  <label for="user_password confirmation">password confirmation</label>
  <input autocomplete="off" id="user_password_confirmation" name="user[password_confirmation]" size="30" type="password" />

  <br>

  <input class="btn" name="commit" type="submit" value="Create user" />
</form>

查看名称属性。所以params会像{"utf8"=>"✓", "authenticity_token"=>"xxx=", "user"=>{"email"=>"qwerty@qwerty.qw", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}, "commit"=>"Create user"}

并且User.creae方法使用模型的属性获取哈希。

于 2013-08-14T05:58:21.817 回答
0

在表单发布后检查开发日志。参数发送为

'user' => {'id' => 'someID', 'name' => 'someName', 'email' =>'some email' }

所以应该有一个包含所有字段数据的用户哈希。您只能params[:user]在控制器中捕获值,就好像 :user 是父哈希一样。

于 2013-08-14T05:57:14.910 回答
0

要创建新用户,我们将执行以下操作。

  <%= form_for :user do |f| %>
    ......
  <% end %>

当您调用 form_for 时,您将向它传递此表单的标识对象。在这种情况下,它是符号:user

在控制器端,我们将像下面那样在数据库中创建用户记录

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

通过params[:user].inspect您可以看到控制器将要查看的内容。

params方法是代表parameters来自表单的(或字段)的对象。params 方法返回一个 ActiveSupport::HashWithIndifferentAccess 对象,它允许您使用字符串或符号访问散列的键。

于 2013-08-14T06:09:00.193 回答