【问题标题】:Not able to set form data into database using rails无法使用 Rails 将表单数据设置到数据库中
【发布时间】:2020-01-06 05:57:41
【问题描述】:

我有一个 project_site 模型,用户将名称文件上传到数据库中。另一个模型是 project_manager,它接受和拒绝布尔字段和备注字段以及每个 project_site 条目。但我无法将备注和状态布尔数据设置到 project_manager 数据库中。这是我的代码:

project_manager.rb

class ProjectManager < ApplicationRecord
  belongs_to :project_site
end

project_site.rb

class ProjectSite < ApplicationRecord
  has_many :project_managers, dependent: :destroy
  validates :name,:attendance, presence: true
end

project_manager_dashboard

  <table>
    <thead>
      <tr>
        <th>Uploaded By</th>
        <th>Attendance File</th>
        <th colspan="2"></th>
      </tr>
    </thead>

    <tbody>
      <% @project_sites.each do |project_site| %>
        <tr>
            <td><%= project_site.name.titleize %></td>
            <% if project_site.attendance? %>
              <td><%= link_to "View Attendance", project_site.attendance.url, :class => "fi-page-export-csv" %></td>
            <% else %>
              <td>No File Present</td>
            <% end %>

            <td>
              <%= form_for [ @project_site, @project_manager ] do |f| %>
                <div class="row">
                  <div class="medium-6 columns">
                    <%= f.radio_button :status, true  %>
                    <%= f.label :approve %>
                    <%= f.radio_button :status, false  %>
                    <%= f.label :reject %>
                  </div>
                  <br>
                  <br>
                  <div class="medium-6 cloumns">
                    <%= f.label :remark %><br/>
                    <%= f.text_area :remark %>
                  </div>

                    </div>
                  <div>
                    <%= f.submit 'Submit', :class => 'button primary' %>
                  </div>

              <% end %>
            </td>
            <td><%= link_to 'Action', project_site, :class=>'button tiny primary' %></td>
        </tr>
      <% end %>
    </tbody>
  </table>

project_manager_controller.rb

class ProjectManagersController < ApplicationController

  def index
   @project_sites = ProjectSite.all.order("created_at DESC").paginate(page: params[:page], per_page: 10)
   @project_manager = ProjectManager.new
   #@project_manager.project_site_id = @project_site.id
  end


  def create
     @project_manager = ProjectManager.new(remark_params)
    @project_manager.project_site_id = params[:project_site_id]
    @project_manager.save

    redirect_to project_managers_path
  end

  def remark_params
    params.require(:project_manager).permit(:remark, :status)
  end
end

routes.rb

  resources :project_sites
  resources :project_managers

【问题讨论】:

  • 你需要一个嵌套路由resources :project_sites do resources :project_managers end
  • 你好改变路线仍然没有解决问题。像这样更改路线会引发表单提交错误

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4 ruby-on-rails-5


【解决方案1】:

控制器端

   class ProjectManagersController < ApplicationController

      def index
       @project_sites = ProjectSite.all.order("created_at DESC").paginate(page: params[:page], per_page: 10)
       @project_manager = ProjectManager.new
      end


      def create
        @project_manager = ProjectManager.new(remark_params)
        @project_manager.save

        redirect_to project_managers_path
      end

      def remark_params
        params.require(:project_manager).permit(:remark, :status, :project_site_id)
      end
    end

查看侧面

<tbody>
  <% @project_sites.each do |project_site| %>
    <tr>
        <td><%= project_site.name.titleize %></td>
        <% if project_site.attendance? %>
          <td><%= link_to "View Attendance", project_site.attendance.url, :class => "fi-page-export-csv" %></td>
        <% else %>
          <td>No File Present</td>
        <% end %>

        <td>
          <%= form_for @project_manager do |f| %>
            <div class="row">
              <div class="medium-6 columns">
                <%= f.radio_button :status, true  %>
                <%= f.label :approve %>
                <%= f.radio_button :status, false  %>
                <%= f.label :reject %>
              </div>
              <br>
              <br>
              <div class="medium-6 cloumns">
                <%= f.label :remark %><br/>
                <%= f.text_area :remark %>
              </div>
                <%=f.hidden_field :project_site_id, value: project_site.id%>
                </div>
              <div>
                <%= f.submit 'Submit', :class => 'button primary' %>
              </div>

          <% end %>
        </td>
        <td><%= link_to 'Action', project_site, :class=>'button tiny primary' %></td>
    </tr>
  <% end %>
</tbody>

【讨论】:

  • 我现在收到此错误-“nil:NilClass 的未定义方法‘合并’”
  • ActionView::Template::Error (nil:NilClass 的未定义方法 `merge'): 42: 43:
    44:
    45: 46: 47: 48:
  • @mick 嗨,我无法使用给定的日志来获取它,您能否将现有代码中的 [ @project_site, @project_manager ] 替换为 @project_manager,这样可以指出对表单提交的正确操作。
  • @mick 如果你明白了,请告诉我?或者如果您需要任何进一步的指导。谢谢
  • 嘿,当我按照你所说的进行更改时,我能够正确呈现表单,但我仍然无法在数据库中设置数据。
【解决方案2】:

您创建的表单是正确的,您需要一个嵌套表单,因为您正在为项目网站创建项目经理。但是,如果您的表单是嵌套的,您还需要嵌套路由。要创建一个新记录,它应该如下所示:

routes.rb

resources :project_sites do
  resources :project_managers, only: [:create]
end

(称为浅嵌套,仅在创建新记录时进行嵌套)。这样您就不必在隐藏字段中传递项目站点 ID,它将成为 url 的一部分。

现在这应该路由 http 请求,当您在表单上单击“提交”时将其提交到您的 ProjectManagersController。那里的代码看起来不错。 如果仍未创建记录,请检查运行rails server 的终端中的日志。你能看到 POST 请求的来源吗?遍历所有行,看看它们是否有意义。 我有一种感觉,项目站点没有分配给项目经理,这就是无法保存记录的原因。因为project_manager.rb 中的belongs_to :project_site 包含验证。是否有回滚而不是保存项目管理器?

【讨论】:

  • only 后面有一个错字。我改变了解决方案 - 它解决了吗?如果没有,请在此处粘贴错误
猜你喜欢
相关资源
最近更新 更多
热门标签