【问题标题】:Multiple Forms on one Ruby page using Rails 4使用 Rails 4 在一个 Ruby 页面上创建多个表单
【发布时间】:2014-06-18 16:50:18
【问题描述】:

我正在构建一个小应用程序,让您可以发布食谱和微博。在主页上,登录用户将看到 2 个表单,一个用于发布食谱,一个用于发布微博。问题:只有一个表单在工作,似乎另一个帖子是由错误的控制器处理的。

我发现了几个与此主题相关的 StackOverflow 问题(一个建议使用 javascript,一个使用基于 form_for 帮助程序中的 :namespace 的解决方案),但它们似乎不起作用或适用于其他设置。

视图 (.haml):主页

=provide(:title, 'Home')
- if signed_in?
  .row
    %aside.span4
      %section
        =render 'shared/user_info'
      %section
        =render 'shared/recipe_form'
      %section
        =render 'shared/micropost_form'

第 1 部分:配方表格

%h3 Add recipe
= form_for(@recipe) do |f|
  = render 'shared/error_messages', object: f.object
  =f.label :name
  =f.text_field :name
  .field
    =f.text_area :content, placeholder: 'Compose new recipe...'
  =f.submit('Post recipe', class:'btn btn-large btn-primary')

第二部分:微博表单

%h3 Add micropost
= form_for(@micropost) do |f|
  = render 'shared/error_messages', object: f.object
  .field
    =f.text_area :content, placeholder: 'Compose new micropost...'
  =f.submit('Post micropost', class:'btn btn-large btn-primary')

错误部分(.erb):

<% if object.errors.any? %>
    <div id="error_explanation">
      <div class="alert alert-error">
        The form contains <%= pluralize(object.errors.count, "error") %>.
      </div>
      <ul>
        <% object.errors.full_messages.each do |msg| %>
            <li>* <%= msg %></li>
        <% end %>
      </ul>
    </div>
<% end %>

控制器:

class MicropostsController < ApplicationController
    before_action :signed_in_user
def create
    @micropost = current_user.microposts.build(micropost_params)
    if @micropost.save
        flash[:success] = 'Micropost created!'
        redirect_to root_url
    else
        render 'static_pages/home'
    end
end

private
    def micropost_params
        params.require(:micropost).permit(:content)
    end
end

食谱的控制器几乎相同。

路线摘录:

resources :microposts, only: [:create, :destroy]
resources :recipes, only: [:create, :destroy]

两种形式都有效;但只有当你用正确的值填充它们时;保留字段 blanc 仍然会出错;错误部分似乎出了点问题......

当提交一个 blanco 食谱时;查看屏幕:here

有没有办法让它工作?

【问题讨论】:

  • 问题是您的haml标签没有正确关闭,并且食谱表单正在扩展自己,直到微博按钮结束标签。您必须正确关闭它们
  • 更改 |f|如果你能找到错误,第二部分可能就足够了。
  • haml 看起来不错,食谱表格在部分标记之前停止。

标签: ruby-on-rails ruby forms


【解决方案1】:

我的猜测是你渲染 f.object 两次,而不是渲染最后一个。更改其中一个部分中的循环变量名称,以便渲染部分不会捕获它。

form_for(@recipes) do |fr|

form_for(@microposts) do |fm|

渲染部分似乎发生在结束标记之前。

【讨论】:

  • model#valid 实际上拼写为model#valid?
  • 感谢您的快速回复。我不确定我是否理解关于将表单嵌套在一个按钮中并将其路由到控制器#update_posts_recipes 的第一部分。这是可以在 form_for 语句中完成的吗?
  • 是的,您需要在一个助手中创建两个表单,并在 form_for 参数处使用路由。因此,当您发送参数时,它会发送两个键。
  • 对不起!我才明白你想要什么!我以为你想从同一个表单创建两个模型!正在编辑!
  • :) 可以找到屏幕截图here
【解决方案2】:

当表单出现错误时,表明用户已尝试填写。当您提交一个空食谱时,您不需要微博表格,反之亦然;一个解决方案是在错误时不呈现其他表单:

在主页视图中:

- if signed_in?
  .row
    %aside.span4
      %section
        =render 'shared/user_info'
      - if @micropost.nil? || @micropost.errors.empty?
        %section
          =render 'shared/recipe_form'
      - if @recipe.nil? || @recipe.errors.empty?
        %section
          =render 'shared/micropost_form'

当您尝试提交有错误的表单时,您会看到您正在提交的表单。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-09
    • 2013-06-24
    • 1970-01-01
    • 1970-01-01
    • 2011-07-16
    • 1970-01-01
    • 1970-01-01
    • 2011-08-16
    相关资源
    最近更新 更多