0

我正在使用high_voltage创建各种数量的登录页面。

在这些页面上,我有不同的字段用于创建用户模型。每个表单都有电子邮件和随机的其他字段。

例如:

# views/pages/home1.html.erb
<%= simple_form_for(User.new) do |f| %>
  <%= f.input :email %>
  <%= f.input :first_name %>
  <%= f.button :submit, 'Sign up' %>
<% end %>

# views/pages/home2.html.erb
<%= simple_form_for(User.new) do |f| %>
  <%= f.input :email %>
  <%= f.input :last_name %>
  <%= f.button :submit, 'Sign up' %>
<% end %>

然后我有用于创建User的控制器。

class UserController < ApplicationController
  def create
    @user = User.new(params[:user])

    if @user.save
      redirect_to root_path
    else
      render 'pages/home' # I don't know what should be here
    end
  end
end

问题是,当有人写错电子邮件地址时,我想呈现正确的模板,但现在我render 'pages/home'.

4

3 回答 3

1

我在这里回答了一个类似的帖子: 从静态页面渲染部分

这是提交数据和显示错误代码的提交: https ://github.com/harlow/high_voltage_demo/commit/0cdbca5b0fe898d27df22787498fc7e350e81422

在高层次上,我们需要一种方法来知道提交了哪个表单(以便在发生错误时呈现正确的表单)。这可以通过在控制器中创建不同的动作来实现。

# config/routes.rb
resources :users, only: [] do
  member do
    post 'short_form'
    post 'long_form'
  end
end

控制器将有两个单独的操作:

class UserController < ApplicationController
  def short_form
    @user = User.new(short_form_params)
    @user.save
  end

  def long_form
    @user = User.new(long_form_params)
    @user.save
  end

  private

  def short_form_params
    params.permit(:user).require(:first_name, :last_name, :email)
  end

  def long_form_params
    params.permit(:user).require(:field1, :field2, :field3)
  end
end

如果您对每个表单都使用一个局部变量,我们可以将 注入User.new局部变量user中。

# views/pages/home.html.erb
<%= render 'users/short_form', user: User.new %>

# views/users/_short_form.html.erb
<div id="short_form">
  <%= simple_form_for user, remote: true, url: create_user_short_form do |f| %>
    <%= f.input :email %>
    <%= f.input :first_name %>
    <%= f.button :submit, 'Sign up' %>
  <% end %>
</div>

# views/users/_long_form.html.erb
<div id="long_form">
  <%= simple_form_for user, remote: true, url: create_user_long_form do |f| %>
    <%= f.input :email %>
    <%= f.input :last_name %>
    <%= f.button :submit, 'Sign up' %>
  <% end %>
</div>

来自控制器的响应将呈现.js.erb文件并检查它是否有效并返回正确的响应:

# views/users/short_form.js.erb
<% if @user.persisted? %>
   # you could redirect the user with JavaScript
   window.location.href = '<%= root_url %>';
   # or dynamically update the content of the page to let the User know their request was submitted
   $('#short_form').html('Thank you for your submission!'); 
<% else %>
   # this will replace the contents of the Form with the errors in it
   $('#short_form').html('<%= j render 'users/short_form', user: @user %>');
<% end %>

希望这一切都有意义。如果您有任何后续问题,请告诉我。

于 2013-12-06T21:55:29.477 回答
0

我没有使用 high_voltage,但根据您提供的链接,它似乎是为静态页面设计的,而不是像您正在使用的表单,所以我认为您有点超出其正常用例。还有其他支持多步骤向导的gem 。

也就是说,您可能只是将页面信息存储在表单上的隐藏字段中,并在您的控制器中,验证它是否是合法的模板选项之一,如果是,则呈现它,否则默认为“pages/home”或返回403 错误或任何看起来最合适的错误。

于 2013-04-24T14:22:07.570 回答
-1

您不能将 current_template 发送到隐藏字段中的服务器吗?如果用户有验证错误,只需获取当前模板的名称并渲染它!

在视图中

  <%= form_for @user do %>
    <%= hidden_field_tag : template, __FILE__ %>
  <% end %>

在控制器中

 if @user.save 
   #redirect 
 else
   render "home/#{params[:template]}"
 end

只是一个想法!

于 2013-04-24T14:21:11.300 回答