【问题标题】:Render partial from static page从静态页面渲染部分
【发布时间】:2013-11-29 20:53:48
【问题描述】:

我正在尝试在我的主要欢迎页面中呈现部分内容(我使用 HighVoltage gem 来创建它), 我的组表单,用户可以在其中创建一个新组...

到目前为止我已经尝试过给我以下错误...

表单中的第一个参数不能包含 nil 或为空

= form_for @group do |f| 
    .fieldset
      - if @group.errors.any?
        .error_messages

我的路线是这样配置的

Giraffle::Application.routes.draw do
    get 'sign_up', to: 'groups#new', as: 'sign_up'
    get 'sign_in', to: 'sessions#new', as: 'sign_in'
    delete 'sign_out', to: 'sessions#destroy', as: 'sign_out'

    resources :sessions
    resources :members
  resources :groups
  resources :events
  resources :event_sets

  root :to => 'high_voltage/pages#show', id: 'welcome'
end

因此,当我尝试加载主页时,直接进入欢迎页面,并因上述错误而崩溃

我想我知道问题是什么......但我不知道如何解决它。我正在尝试呈现表单,但由于“组”可通过从未初始化它会引发此错误。

我的代码...

views/pages/welcome.html.slim

row id="div"
  .small-4 id="innerDiv"
  .row
    .small-4.columns align="center"
      img src="groupIcon.png" id="mainImg" 
    .large-6.large-offset-2.columns
      h1 Sign Up
      = render :partial => '/groups/form'

views/groups/_form.html.slim

= form_for @group do |f| 
  .fieldset
    - if @group.errors.any?
      .error_messages
        h2 Form is invalid
        ul
          - @group.errors.full_messages.each do |message|
            li= message
    .row
      .small-12.columns
        = f.text_field :name, placeholder: "Name"
    .row
      .small-12.columns
        = f.text_field :group_id, placeholder: "Group"
    .row
      .small-12.columns
        = f.password_field :password, placeholder: "Password"
    .row
      .small-12.columns
        = f.password_field :password_confirmation, placeholder: "Confirm Password"
    .row
      .small-3.columns
        .actions= f.submit 'Sign Up', class: 'button radius'

编辑

controllers/groups_controller.rb

class GroupsController < ApplicationController
    load_and_authorize_resource

    before_action :set_group, only:     [:edit, :update, :destroy]
    before_action :authorize, except: [:new,  :create]

    def new
        @group = Group.new
    end

    def edit
    end

    def create
        @group = Group.new(group_params)

        if @group.save
            redirect_to root_url, notice: 'Signed Up!' 
        else
            render 'new'
        end
    end

    def update
        if @group.update(group_params)
      redirect_to root_url, notice: 'Group Info was successfully updated.'
    else
      render action: 'edit'
    end
  end

    private
        def set_group
      @group = Group.find(params[:id])
    end

        def group_params
            params.require(:group).permit(:group_id, :name, :password, :password_confirmation)
        end
end

【问题讨论】:

  • 看起来@group 未在您的控制器操作中设置。请同时发布您的控制器代码。
  • 您正试图从WelcomeController 调用它,因此您需要在WelcomeController 操作中设置@group = Group.new。
  • 实际上“欢迎”是一个静态页面......所以它不需要控制器:/(我在这个页面上使用高压 gem)。我稍微改变了主要问题
  • 我认为最好创建一个控制器并在控制器操作中设置@group,而不是使视图混乱。看看:github.com/thoughtbot/high_voltage#override
  • 您的问题是您正在尝试创建一个静态页面,但它需要在服务器端创建动态信息,即views/groups/_form.html.slim 视图中的@group。查看(并发布到您的问题)由 HighVoltage 创建的结果 html 中的表单定义。

标签: ruby-on-rails high-voltage


【解决方案1】:

我设置了一个高压演示应用程序,其中包含一个用于创建“查询”的表单。

Here is the commit with the changes to make the form work.

以下是高级步骤:

创建将在视图中使用的表单:

<%= simple_form_for resource, html: { novalidate: true }, remote: true do |f| %>
  <%= f.input :name %>
  <%= f.input :email %>
  <%= f.input :comments, as: :text %>
  <%= f.button :submit, value: 'Submit' %>
<% end %>

创建一个控制器来处理请求:

class InquiriesController < ApplicationController
  def create
    @inquiry = Inquiry.new(params[:inquiry])
    @inquiry.save
  end
end

Inquiry 对象上的.save 方法将执行通过电子邮件发送请求或保存到数据库等的魔力。注意对valid? 的调用由ActiveModel::Model 提供,如果所有的验证都通过了。

class Inquiry
  include ActiveModel::Model

  attr_accessor :comments, :email, :name

  validates :comments, presence: true
  validates :email, presence: true, email: true
  validates :name, presence: true

  def save
    if valid?
      # send an email or persist to the database...
    end
  end
end

通过使用.js.erb 文件,我们可以从控制器端点向静态页面返回成功消息或错误。

<% if @inquiry.valid? %>
  $('#inquiry_form').html('<h2>Thank you for contacting us!</h2>');
<% else %>
  $('#inquiry_form').html('<%= j render 'inquiry_form', resource: @inquiry %>');
<% end %>

如果请求有效,则返回“成功”消息,如果请求无效,则返回带有错误的表单。

【讨论】:

    猜你喜欢
    • 2017-12-16
    • 1970-01-01
    • 1970-01-01
    • 2021-11-16
    • 2019-06-20
    • 1970-01-01
    • 1970-01-01
    • 2017-12-28
    • 2023-03-21
    相关资源
    最近更新 更多