Rails 5.1.2 Wicked Gem和嵌套属性

时间:2017-09-02 15:25:05

标签: ruby-on-rails devise nested-forms wicked-gem ruby-on-rails-5

Ruby: 2.4.0
Rails: 5.1.2

嘿伙计们, 我不是Rails的新手,但绝对不是专家。

我要做的是创建一个带有嵌套属性的邪恶向导。

我已经通过Google,GitHub和StackOverflow进行了搜索,但除了thisthat之外没有找到任何内容。

两者都不起作用。

我所拥有的是以下内容:

-_-_-_-_-_-_-_-_-_-_-_-_编辑!!! -_-_-_-_-_- _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ < / em>

问题是,我没有定义创建动作-.-' 我不得不修改一些变量名。在我看来,轨道有时会混淆多元化。幸运的是终于能够做到这个超级简单的东西:D

模型

user.rb(来自设计宝石)

 class User < ApplicationRecord

    has_one :accountinfo
    accepts_nested_attributes_for :accountinfo, update_only: true

    devise :database_authenticatable, :registerable,
           :recoverable, :rememberable, :trackable, :validatable

    validates_presence_of :password, :email, :accounttype

end

account_information.rb

编辑:accountinfo.rb

我希望存储用户信息的模型不会使我的用户表超载(一切都很好)

class AccountInformation < ApplicationRecord

   belongs_to :user

end

我曾经使用过几次恶人而且它总是有效但只有当我将所有信息存储在用户模型中时......由于更好的结构和东西,我不想这样做。

控制器

users_controller.rb

class UsersController < ApplicationController

    def index
        redirect_to root_path
    end

    def create
        @user = User.create( user_params )
    end

    def show

        @user = User.find(params[:id])

        if user_signed_in?
            render 'show'

        else
            redirect_to root_path
        end
    end


    private
    def user_params
        params.require(:user).permit(:first_name, :accounttype, :accountinfo, accountinfos_attributes:[:user_id, :competence])
    end
end


user_steps_controller

class UserStepsController < ApplicationController
include Wicked::Wizard
steps :welcome

before_action :authenticate_user!


def show
        @user = current_user
        render_wizard
end

def create
        @accountinfo = @user.accountinfo.create(user_params)
end

def update  
        @user = current_user
        @user.update(user_params)

        render_wizard @user
end


private
def user_params
    params.require(:user).permit(:accountinfo,accountinfo_attributes:[:id, :competence])
end

private
def redirect_to_finish_wizard_path
    redirect_to root_path, notice: "Danke für deine Zeit!"
end

   end


   private
   def user_params
       params.require(:user).permit(:accounttype, 
       account_information_attributes:[:id, :competence])
   end

   private
   def redirect_to_finish_wizard_path
      redirect_to root_path, notice: "Danke für deine Zeit!"
   end

   end

浏览

welcome.html.erb

       <%= form_for @user, url: wizard_path do |f| %>    
                <%= f.fields_for(:accountinfo) do |builder| %>
                    <div class="m-wizard__choose2 m-wizard__choose2--border-right">
                       <label>   
                            <%= builder.radio_button :competence, 1, class: "input-hidden" %>
                             <i class="icon-people-male h1"></i>
                            <p class="h6 m-text--bold">Designer</p>
                        </label> 
                    </div>

                    <div class="m-wizard__choose2">
                        <label>   
                            <%= builder.radio_button :competence, 2, class: "input-hidden" %>
                             <i class="icon-people h1"></i>
                            <p class="h6 m-text--bold">Texter</p>
                        </label>                  
                    </div>
                <% end %>

                <div class="m-text--center">
                    <%= f.submit "Weiter", class: "m-button" %>
                </div>
            <% end %>

也许你已经发现了一些东西......

我希望我的用户在注册后访问welcome.html.erb。

设计运行良好,重定向到邪恶的控制器。 wicked一如既往地正常工作,路由也正确设置但这次我希望将“能力”的信息存储到account_information的相关表中。

按下“Weiter”(德语中的“continue”)按钮后,没有任何反应,但网站会重新渲染。这是我的控制台输出的内容:

  

UserStepsController处理#news更新为HTML参数:   { “UTF8”=&gt; “中✓”,   “authenticity_token”=&gt; “中uYRJyCeBGyyDcWUtIj62fmT9oMpTnUQ3p + CSi3n8tSKKLguB1j / CPZaeuZCcmpCoBjJDKY6yz7 / Z2wXfAO7YBg ==”,   “用户”=&GT; { “account_information_attributes”=&GT; { “能力”=&gt; “中1”}},   “commit”=&gt;“Weiter”,“id”=&gt;“welcome”}用户加载(0.3ms)SELECT   “users”。* FROM“users”WHERE“users”。“id”=?订购“用户”。“id”   ASC限制? [[“id”,12],[“LIMIT”,1]](0.0ms)开始交易   AccountInformation加载(0.1ms)SELECT“account_informations”。* FROM   “account_informations”WHERE“account_informations”。“user_id”=?   限制? [[“user_id”,12],[“LIMIT”,1]](0.1ms)回滚   事务(0.0ms)开始事务(0.0ms)回滚   交易

enter image description here

2 个答案:

答案 0 :(得分:0)

据Wicket医生说:

class AfterSignupController < ApplicationController
  include Wicked::Wizard

  steps :confirm_password, :confirm_profile, :find_friends

  def show
    @user = current_user
    case step
    when :find_friends
      @friends = @user.find_friends
    end
    render_wizard
  end
end

您的控制器中应该有case step,我在您当前的代码中看不到。

看起来像是重定向问题

答案 1 :(得分:0)

我找到了解决方案。问题是缺少创建动作和其他一些东西。我编辑了帖子,所以你可以阅读ist