表单编辑文本值ROR的未定义方法

时间:2015-07-12 06:00:21

标签: ruby-on-rails forms parameter-passing

我正在尝试将一些数据从视图发送到控制器。我正在使用表格。我有一个制造商控制器和一个用户控制器。每当我创建新制造商时我想做什么我也在创建具有特定值的新用户。所以我的表单包含很少的制造商值和很少的用户值。我通过以下方式尝试了这些事情:

// inside ManufacturersController
def new
  @manufacturer = Manufacturer.new
  @user = User.new
end

def create
  @manufacturer = Manufacturer.new(manufacturer_params)
  @user = User.new(user_params)

  @manufacturer.save
  redirect_to @manufacturer
end 

 private
   def manufacturer_params
params.permit(:name, :license_no, :contact_no, :address, :country, :city, :pincode,:email_id)
 end
   def user_params
params.permit(:email, :password, :confirm_password)
  end


  // inside form view 

<div class="form-group">
  <label class="col-sm-3 control-label">Email Id</label>

  <div class="col-sm-3">
      <input class="form-control" name="email_id" value="<%= @manufacturer.email_id %>">
  </div>

     <div class="form-group">
  <label class="col-sm-3 control-label">Password</label>

  <div class="col-sm-6">
      <input class="form-control" name="password" value="<%= @user.password %>">  
  </div>

以上代码未完成代码。我的表单字段密码出错了。它显示错误undefined method password for #<User:0x7a42580>

我做错了吗?需要一些帮助。谢谢。

1 个答案:

答案 0 :(得分:1)

在Rails中,您可以使用哈希值传递参数:

user: { name: 'Max' }

内置表单助手如何工作,这是一个很好的做法。

创建表单时,您可以使用表单助手为输入获取正确的html name属性。

<%= form_for(@user) do %>
  <%= f.text_field :email # user[name] %>
  <%= f.password_field :password #  user[password] %>
<% end %>

Rails会将@user.email的值绑定到电子邮件字段。

如果您想一次创建多个记录,可以使用accepts_nested_attributes_for

class Manufacturer < ActiveRecord::Base
  has_many :users
  accepts_nested_attributes_for :users
  validates_associatiated :users
end 

class User < ActiveRecord::Base
  belongs_to :manufacturer
end

这使您可以Manufacturer.new(name: 'Acme Corp', users_attibutes: [{ name: 'Max' }])同时创建制造商和嵌套用户。

这是设置控制器的方法

class ManufacturersController

  # ...

  def new 
    @manufacturer = Manufacturer.new
    @manufacturer.users.build
  end

  def create
    @manufacturer = Manufacturer.create(manufacturer_params)
    # ...
  end

  private
  def manufacturer_params
    params.require(:manufacturer)
      .permit(
        :name, :license_no, :contact_no, :address, :country, 
        :city, :pincode, :email_id, 
        users_attributes: [:email, :password, :confirm_password]
      )
  end
end

你的表格:

<%= form_for(@manufacturer) do |f| %>
  <%= f.text_field :name # manufacturer[name] %>
  <%= f.text_field :license_no %>

  ...

  <%= f.fields_for(:users) do |user_fields| %>
    <%= user_fields.text_field :email # manufacturer[users_attibutes][1][email] %>
    ...
  <% end &>
<% end %>

正如@Venkat ch已经指出在数据库中存储明文密码真是不安全。请改用has_secure_password