【问题标题】:How to automatically fill in the form with data from other models in Rails如何使用 Rails 中其他模型的数据自动填写表单
【发布时间】:2017-07-06 22:19:42
【问题描述】:

我是Rails 的新手。我正在尝试制作一个应用程序,学生可以在其中登录并注册考试。我有以下与此相关的模型和控制器:

主题有以下列:

t.string  "name"  t.integer "ects"
t.integer "year" t.integer "professor_id" 

与考试的关系:has_one :exam 与教授的关系:belongs_to :professor

教授有以下列:

t.string  "first_name"
t.string  "last_name"
t.string  "title" 

与考试的关系:has_many :exams 与主题的关系:has_many :subjects

考试有以下列:

t.date    "start_date"  
t.string  "department"  
t.integer "professor_id"  
t.integer "subject_id"

它与主题的关系:belongs_to :subject 与教授的关系:belongs_to :professor 与注册的关系:

has_many :signups
has_many :signupers, through: :signups, class_name: 'User'

注册有以下列:

t.integer "exam_id"
t.integer "user_id"

与考试的关系:belongs_to :exam 与用户的关系:belongs_to :user

我已经连接了所有东西,并在链接到 new_signup_path 的考试显示视图上创建了一个注册按钮。当用户被重定向到表单时,我希望数据出现在表单中。我想在表格中显示学科名称、教授姓名和开始日期。因此,用户只需单击提交按钮。

我已经制作了这个表格,它有效,但它是空的:

<%= form_for @signup do |f| %>
    <%= f.fields_for :exam do |e| %>   
       <%= e.label :start_date %>
       <%= e.date_field :start_date %> 
    <% end %> 
    <%= f.submit "Submit", class: "btn btn-large btn-primary" %> 
<% end %>

我还想要教授姓名(Professor model)和学科名称(Subject model)。

这是我的注册控制器:

before_action :signed_in_user, only: [:index, :new, :create]

def index
    if current_user.role == 1
        @signups = Signup.all
    else  
        @signups = Signup.where(user_id:current_user.id)
    end
end 

def new
    @signup = Signup.new
end 

def create
    @signup = Signup.new(signup_paramas)
    @signup.user_id = current_user.id
    if @signup.save
        flash[:success] = "You signed up for the exam."
        redirect_to @signups
    else 
        render :new
    end
end
private 
def signup_paramas
    params.require(:signup).permit(:user_id).merge(exam_id: @exam.id)
end

我在谷歌上搜索了这个问题 2 周,但我一直无法找到解决方案。 我感谢任何形式的帮助。在此先感谢:)

【问题讨论】:

标签: ruby-on-rails forms model populate


【解决方案1】:

在注册按钮上添加exam_id 以重定向url 参数:new_signup_path(exam_id: @exam.id)

然后在注册控制器的新操作中,您将能够访问考试:

def new
  @signup = Signup.new
  @exam = Exam.find(params[:exam_id])
end

之后,您将能够在视图中使用@exam 来填充表单字段:

<%= form_for @signup do |f| %>
  <%= f.fields_for :exam do |e| %>   
    <%= e.label :start_date %>
    <%= e.date_field :start_date, value: @exam.start_date %> 
  <% end %> 
  <%= f.submit "Submit", class: "btn btn-large btn-primary" %> 
<% end %>

您还可以通过@exam 访问教授和学科。这可以让您了解从哪里开始。

【讨论】:

  • 我之前尝试过使用这行代码:@exam = Exam.find(params[:exam_id]),但它说“找不到带有'id'的考试,因为我没有'不知道我应该重定向 url 参数。这很有意义 date_field 是空的,因为我没有输入任何值。我非常感谢你的回答。它对我帮助很大。
  • 我已经制作了显示所有必要数据的表格。 prntscr.com/eaqwk9 但是当我提交它时,我得到:显示 C:/ruby/rails_project/app/views/signups/new.html.erb 其中第 8 行出现:未定义的方法 `subject' 用于 nil:NilClass。这可能是因为我在 signup_params 中不允许这样做。我试着把这样的东西: params.permit(:exam_id, :user_id).merge(subject_id: @exam.subject.id,professor_id: @exam.professor.id) 我也把主题和教授的定义放在新的操作,但它不识别主题或教授 i signup_params。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-29
  • 1970-01-01
  • 1970-01-01
  • 2013-08-31
相关资源
最近更新 更多