【问题标题】:Nested form sends :id instead of friendly_id in POST request嵌套表单在 POST 请求中发送 :id 而不是friendly_id
【发布时间】:2014-11-13 14:42:49
【问题描述】:

routes.rb:

resources :courses, path: '' do
  resources :students do
    resources :awards
  end
end

学生/show.html.erb

<%= form_for [@course, @student, @award] do |f| %>

  <div class="field">
    <%= f.label :ticket %><br>
    <%= f.text_field :ticket %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>

<% end %>

models/student.rb

belongs_to :course
has_many :awards, dependent: :destroy

extend FriendlyId
friendly_id :uuid, use: [ :slugged, :finders ]

controllers/students_controller.rb

before_action :set_course

def show
  @student = @course.students.find_by_uuid! params[:id]
  @award = @student.awards.build
  @awards = @student.awards.load.where.not('id' => nil) # exclude empty row
end

private

  def set_course
    @course = Course.find_by_title!(params[:course_id])
  end

  def student_params
    params.require(:student).permit(:email, :uuid, :grade_point_average, :course_id)
  end

controllers/awards_controller.rb

before_action :set_variables

def create
  @award = @student.awards.build award_params
  if @award.save
    redirect_to course_student_path(@course, @student.uuid)
  else
    redirect_to course_student_path(@course, @student.uuid)
  end
end

private

  def set_variables
    @course = Course.find_by_title! params[:course_id]
    @student = @course.students.find_by_uuid! params[:student_id]
  end

  def award_params
    params.require(:award).permit(:ticket, :student_id)
  end

现在,我希望从表单发送的 POST 请求如下所示:

POST "/3344-2334/students/hh36-f4t4-545t/awards"

但这是服务器得到的

POST "/3344-2334/students/5/awards"

我收到错误消息:

ActiveRecord::RecordNotFound in AwardsController#create

因为它获取的是 :id (5) 而不是friendly_id :uuid (hh36-f4t4-545t)

为什么家长(课程)得到一个friendly_id :title,而孩子(学生)得到一个不友好的:id?我是 Rails 新手,完全迷路了。

【问题讨论】:

  • 对于学生显示,当您导航到特定学生时,url 是否带有 uuid 或 id ?

标签: ruby-on-rails ruby-on-rails-4 friendly-id


【解决方案1】:

您可以覆盖学生模型的默认返回参数,以提供 uuid 而不是 id。试着把它放在你的学生模型中。

def to_param
 uuid
end

你也可以看看this,它可以帮助你了解friendlyId的工作原理。

【讨论】:

  • 谢谢,成功了。似乎我应该在更多地方实施。 Rails 新手,就像过山车,从幸福到绝望……
  • 如果所有列都称为 uuid,您可以将此方法放在关注点中并将其包含在您想要的模型中,而不是到处重复。
  • 对应用程序使用了to_param 覆盖,我将uuid 用于任何正面视图,但将id 用于数据库关系的幕后,并且到目前为止它运行良好。一条评论:我使用uuid || id 作为我的方法,以防uuid 未设置在特定记录上(总是很高兴有后备)。
猜你喜欢
  • 1970-01-01
  • 2021-10-12
  • 1970-01-01
  • 1970-01-01
  • 2014-04-16
  • 2018-10-29
  • 1970-01-01
  • 1970-01-01
  • 2018-09-04
相关资源
最近更新 更多