【问题标题】:Accessing multiple models through one controller通过一个控制器访问多个模型
【发布时间】:2014-08-04 18:22:16
【问题描述】:

对不起,菜鸟问题。我有一个允许用户创建简历的表单。我创建了一个简历脚手架,其中包含头衔和职业目标的输入。我为其他部分(经验、教育、技能)制作了单独的数据库表。我希望使用带有简历控制器的resumes/views/_form.html 单一表单提交所有这些信息。所以在我放入的简历模型中(has_many :experiences)和我放入的体验模型中(belongs_to :resume)。我的体验表有两个字段(:job_title:job_description),所以在views/resumes/_form.html 中我为:job_title:job_description 添加了两个额外字段。在这一点上,我有点迷路了。如何使用 Resume 控制器的“new”和“create”方法将这些输入值保存到适当的数据库表中?我知道我现在缺少代码,但如果有任何帮助,我会收到此错误:

undefined method `job_title' for #<Resume:0x007fe5b2304748>

Trace of template inclusion: app/views/resumes/new.html.erb

app/views/resumes/_form.html.erb:24:in `block in _app_views_resumes__form_html_erb___303730996527532694_70312260165660'
app/views/resumes/_form.html.erb:1:in `_app_views_resumes__form_html_erb___303730996527532694_70312260165660'
app/views/resumes/new.html.erb:3:in `_app_views_resumes_new_html_erb___2010250825676564736_70312281682320'

这里是 /resumes/_form.html.erb 视图

    <%= form_for(@resume) do |f| %>
  <% if @resume.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@resume.errors.count, "error") %> prohibited this resume from being saved:</h2>

      <ul>
      <% @resume.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= f.label :title %><br>
    <%= f.text_field :title %>
  </div>
  <div class="field">
    <%= f.label :objective %><br>
    <%= f.text_area :objective %>
  </div>
  <%= fields_for @experience do |fa| %>
    <div class="field">
      <%= fa.label :job_title %><br>
      <%= fa.text_area :job_title %>
    </div>
    <div class="field">
      <%= fa.label :company_name %><br>
      <%= fa.text_area :company_name %>
    </div>
  <% end %>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

resumes_controller

class ResumesController < ApplicationController
      before_action :set_resume, only: [:show, :edit, :update, :destroy]

      # GET /resumes
      # GET /resumes.json
      def index
        @resumes = Resume.all
      end

      # GET /resumes/1
      # GET /resumes/1.json
      def show
      end

      # GET /resumes/new
      def new
        @resume = Resume.new
      end

      # GET /resumes/1/edit
      def edit
      end

      # POST /resumes
      # POST /resumes.json
      def create
        @resume = Resume.new(resume_params)

        respond_to do |format|
          if @resume.save
            format.html { redirect_to @resume, notice: 'Resume was successfully created.' }
            format.json { render action: 'show', status: :created, location: @resume }
          else
            format.html { render action: 'new' }
            format.json { render json: @resume.errors, status: :unprocessable_entity }
          end
        end
      end

      # PATCH/PUT /resumes/1
      # PATCH/PUT /resumes/1.json
      def update
        respond_to do |format|
          if @resume.update(resume_params)
            format.html { redirect_to @resume, notice: 'Resume was successfully updated.' }
            format.json { head :no_content }
          else
            format.html { render action: 'edit' }
            format.json { render json: @resume.errors, status: :unprocessable_entity }
          end
        end
      end

      # DELETE /resumes/1
      # DELETE /resumes/1.json
      def destroy
        @resume.destroy
        respond_to do |format|
          format.html { redirect_to resumes_url }
          format.json { head :no_content }
        end
      end

      private
        # Use callbacks to share common setup or constraints between actions.
        def set_resume
          @resume = Resume.find(params[:id])
        end

        # Never trust parameters from the scary internet, only allow the white list through.
        def resume_params
          params.require(:resume).permit(:title, :objective)
        end
    end

【问题讨论】:

  • 添加resumes/views/_form.html代码。
  • 需要更多细节才能更深入。但基本要点是您必须使用控制器将数据存储在不同的模型中。
  • @RAJ... - 添加了 _form.html 视图。如果您需要控制器视图或任何内容,请告诉我。感谢您的帮助,非常感谢!
  • @SankalpSingha 如果有帮助,我添加了 resumes/view/_form.html。如果控制器也有帮助,我可以发布它。非常感谢您的帮助!
  • 是的,展示控制器,这样我们就可以告诉您如何修改它以将您发布的数据传播到各种模型。

标签: ruby-on-rails ruby model-view-controller ruby-on-rails-4


【解决方案1】:

我认为你需要改变

<%= fields_for @experience do |fa| %>

<%= f.fields_for @experience do |fa| %>

并确保您在模型中正确设置了accepts_nested_attributes_for

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多