致力于数据库尝试以不同的方式改变形式

时间:2013-09-19 13:52:24

标签: ruby-on-rails devise

我有一个分类模型,它以一种看起来像这样的方式与学生模型相连接

classified.rb

belongs_to :student

在我的学生模型中

has_many :classifieds

分类广告表包含a column for student_id

当我前往rails控制台时

我可以通过

为该特定学生记录创建新的分类
Student.find(19).classifieds.create(:ad_title => "blah", :ad_content => "blah", :location => "blah")

记录会自动生成student_id,因为它是在学生的立场创建的。

现在问题是我有一个分类控制器,在视图中有一个新的创建方法和一个新表单

我在分类广告的立场创建了一个新广告,这里是表格

<div>
新广告: <br><br>

<%= simple_form_for @advertisement do |f| %>
    <%= f.input :ad_title, label: "Title" %><br>
    <%= f.input :ad_content, label: "Content"%><br>
    <%= f.input :location, label: "Location"%><br>
    <%= f.input :student_id, label: "Your Student ID"%><br>
    <%= f.button :submit, "Add an Advertisement" %>

<% end %>
</div>

问题是student_id必须存在才能使该特定记录显示在索引中,而我的用户不知道他们的ID。

如何使用表单

在学生的立场创建分类

我考虑去我的学生控制器并添加这样的方法

def create_classified_ad
     @student = Student.find(params[:id])
     @classified = @student.classified.create(params[:classified])
end 

我正在使用设备,所以有用户会话?我不知道会话是如何工作的我希望在登录后找到该特定学生并让该学生使用表单中的输入创建分类广告,以便正确创建记录?

问题更像是如何使用表单将数据正确插入到连接表中? (而不仅仅是将数据插入一个简单的无关系表中)

1 个答案:

答案 0 :(得分:2)

您不应该从表单中传递student_id。如果您有设计会话,则应该可以访问current_user

def new
  @classified = current_user.classifieds.build
end

def create
  @classified = current_user.classifieds.build(params[:classified])
  if @classified.save
    # do something
  else
    # handle failure
  end
end

在索引中,您可以这样做:

def index
  @classifieds = current_user.classifieds.all
end

所有这些都假定你有一个设计会议。如果没有,只需像这样取得学生:

@student = Student.find(params[:student_id])
@classified = @student.classifieds.build

在用户下为分类广告设置嵌套路线:

resources :users do
  resources :classifieds
end

这允许您从student_id param中获取学生。您的路线是这样的:new_student_classified_path(@student)