使用rails 4,以简单的形式设计多态关联嵌套属性 [英] Devise polymorphic association nested attributes with simple form using rails 4

查看:137
本文介绍了使用rails 4,以简单的形式设计多态关联嵌套属性的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



这是我的代码:



用户:

  class User< ActiveRecord :: Base 
devise:database_authenticatable,
:rememberable,:trackable,,validatable

belongs_to:loginable,polymorphic:true
end

设计师:

 设计师& ActiveRecord :: Base 
has_one:user,as::loginable
acceptance_nested_attributes_for:user

end

布局:

 <%= simple_form_for [:admin,@designer] :html => {:class => 'form-horizo​​ntal'} do | f | %GT; 
<%if f.error_notification%>
< div class =alert alert-error淡入>
< a class =closedata-dismiss =alerthref =#>& times;< / a>
<%= f.error_notification%>
<%if @ designer.errors.any? %GT;
< ul>
<%@ designer.errors.full_messages.each do | msg | %GT;
< li><%= msg%>< / li>
<%end%>
< / ul>
<%end%>

< / div>
<%end%>

< div class =control-group>
<%= f.label:profile_name,:class => 'control-label'%>
< div class =controls>
<%= f.text_field:profile_name,:class => 'text_field'%>
< / div>
< / div>

<%= f.simple_fields_for users do | u | %GT;

< div class =control-group>
<%= u.label:email,:class => 'control-label'%>
< div class =controls>
<%= u.text_field:email,:class => 'text_field'%>
< / div>
< / div>

< div class =control-group>
<%= u.label:password,:class => 'control-label'%>
< div class =controls>
<%= u.password_field:password,:class => 'text_field'%>
< / div>
< / div>

< div class =control-group>
<%= u.label:type,:class => 'control-label'%>
< div class =controls>
<%= u.input:role,:label => false do%>
<%= u.select:role_id,Role.all.map {| r | [r.name,r.id]}%>
<%end%>
< / div>
< / div>

< div class =control-group>
<%= u.label:firstname,:class => 'control-label'%>
< div class =controls>
<%= u.text_field:firstname,:class => 'text_field'%>
< / div>
< / div>
<%end%>


< div class =form-actions>
<%= f.submit nil,:class => 'btn btn-primary'%>
< / div>
<%end%>

控制器:

 code> def create 
@user = User.new(designer_params)
@designer = Designer.new(designer_params)
@ user.loginable = @designer

respond_to do | format |
如果@ user.save! &安培;&安培; @ designer.save!
format.html {redirect_to admin_designers_path,notice:'Designer was successfully created。'}
format.json {render action:'show',status::created,location:admin_designer_path(@designer)}
else
format.html {render action:'new'}
format.json {render json:[designer:@ designer.errors,user:@ user.errors],status::unprocessable_entity }
end
end
end

def designer_params
params.permit(:profile_name,:user,user_attributes:[:email,,password,密码,:firstname,:lastname,:address,:邮政编码,:城市,国家,:角色,角色]]
end

我的参数似乎忽略了用户属性,我只是因为某些原因看到个人资料名称。



有关如何修复的任何想法这将非常感谢



谢谢!

解决方案

我设法解决我自己的问题。所以我发布的答案希望拯救别人很多时间。



我最终为用户参数创建另一个私有方法

  def designer_params 
params.require(:designer).permit(:profile_name,user_attributes:[:email,:password,:password,:firstname, lastname,:address,:postalcode,:city,:country,,role,,role_id]
end
def user_params
params [:designer] [:user_attributes]。 ,:password,:password,:firstname,:lastname,:address,:postalcode,:city,:country,,role,,role_id)
end

然后使用这些来创建我的关系

  def create 
@designer = Designer.new(designer_params)
@user = User.new(user_params)
@ user.loginable = @designer
@ designer.save!
end

如果您无法查看嵌套表单,请确保使用
build_方法

  def new 
@designer = Designer.new
@user = @designer .build_user
end


I am making a polymorphic association with devise and simple for but for some reason i cant get the params to work

here is my code:

User:

class User < ActiveRecord::Base
  devise :database_authenticatable,
         :rememberable, :trackable, :validatable

  belongs_to :loginable, polymorphic: true
end

Designer:

class Designer < ActiveRecord::Base
  has_one :user, as: :loginable
  accepts_nested_attributes_for :user

end

Layout:

<%= simple_form_for [:admin, @designer] , :html => { :class => 'form-horizontal' } do |f| %>
    <% if f.error_notification %>
        <div class="alert alert-error fade in">
          <a class="close" data-dismiss="alert" href="#">&times;</a>
          <%= f.error_notification %>
          <% if @designer.errors.any? %>
              <ul>
                <% @designer.errors.full_messages.each do |msg| %>
                    <li><%= msg %></li>
                <% end %>
              </ul>
          <% end %>

        </div>
    <% end %>

    <div class="control-group">
      <%= f.label :profile_name, :class => 'control-label' %>
      <div class="controls">
        <%= f.text_field :profile_name, :class => 'text_field' %>
      </div>
    </div>

    <%= f.simple_fields_for users do |u| %>

        <div class="control-group">
          <%= u.label :email, :class => 'control-label' %>
          <div class="controls">
            <%= u.text_field :email, :class => 'text_field' %>
          </div>
        </div>

        <div class="control-group">
          <%= u.label :password, :class => 'control-label' %>
          <div class="controls">
            <%= u.password_field :password, :class => 'text_field' %>
          </div>
        </div>

        <div class="control-group">
          <%= u.label :type, :class => 'control-label' %>
          <div class="controls">
            <%= u.input :role, :label => false do %>
                <%= u.select :role_id, Role.all.map { |r| [r.name, r.id] } %>
            <% end %>
          </div>
        </div>

        <div class="control-group">
          <%= u.label :firstname, :class => 'control-label' %>
          <div class="controls">
            <%= u.text_field :firstname, :class => 'text_field' %>
          </div>
        </div>
    <% end %>


    <div class="form-actions">
      <%= f.submit nil, :class => 'btn btn-primary' %>
    </div>
<% end %>

Controller:

  def create
    @user = User.new(designer_params)
    @designer = Designer.new(designer_params)
    @user.loginable = @designer

    respond_to do |format|
      if @user.save! && @designer.save!
        format.html { redirect_to admin_designers_path, notice: 'Designer was successfully created.' }
        format.json { render action: 'show', status: :created, location: admin_designer_path(@designer) }
      else
        format.html { render action: 'new' }
        format.json { render json: [designer: @designer.errors, user: @user.errors], status: :unprocessable_entity }
      end
    end
  end

  def designer_params
    params.permit(:profile_name, :user, user_attributes: [:email, :password, :password, :firstname, :lastname, :address, :postalcode, :city, :country, :role, :role_id])
  end

My params seems to ignore the user attributes, i only see profile name for some reason.

Any ideas on how to fix this would be greatly appreciated

Thanks!

解决方案

I managed to resolve my own issues. so i am posting the answer hoping to save someone else lots of time.

i ended up creating another private method for the user params

  def designer_params
    params.require(:designer).permit(:profile_name, user_attributes: [:email, :password, :password, :firstname, :lastname, :address, :postalcode, :city, :country, :role, :role_id])
  end
  def user_params
    params[:designer][:user_attributes].permit(:email, :password, :password, :firstname, :lastname, :address, :postalcode, :city, :country, :role, :role_id)
  end

and then using those to create my relationship

  def create
    @designer = Designer.new(designer_params)
    @user = User.new(user_params)
    @user.loginable = @designer
    @designer.save!
  end

also if you are having trouble viewing the nested form make sure to use the build_ method

  def new
    @designer = Designer.new
    @user = @designer.build_user
  end

这篇关于使用rails 4,以简单的形式设计多态关联嵌套属性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆