【发布时间】:2016-11-03 02:01:25
【问题描述】:
我研究过类似的问题,但我认为他们没有解决我的特定问题:
Rails form_for results in POST instead of PUT when trying to edit
form_for with nested resources
我是 Rails 的新手(使用 Rails 4.2.5),我正在尝试我的第一个应用程序。我的问题有两个:(1)当用户去编辑用户故事时,表单的字段不会填充以前输入的数据(2)重新提交表单时,会创建一个新条目,而不是编辑旧条目数据。
我感觉我的 user_stories/edit.html.erb 的 form_for 是问题所在。当我从表单中取出 .build 方法时,我收到以下错误消息:
#UserStory::ActiveRecord_Associations_CollectionProxy:0x007f456a759138 的未定义方法“to_key”>
我的项目视图的projects/_form.html.erb 没有.build 方法并且功能正常。但是,我可以让 `user_stories/_form.html.erb 表单工作的唯一方法是附加构建方法。
这是我的代码:
user_story.rb
class UserStory < ActiveRecord::Base
belongs_to :project
belongs_to :user
include RankedModel
ranks :row_order
end
项目.rb
class Project < ActiveRecord::Base
has_many :user_stories
belongs_to :user
end
routes.rb
Rails.application.routes.draw do
devise_for :users
resources :projects do
resources :user_stories
end
end
resources :user_stories do
post :update_row_order, on: :collection
end
root 'welcome#index'
end
user_stories/_form.html.erb
<%= form_for([@project, @user_story.build]) do |f| %>
<div class="form-group">
<p>As a ...</p>
<%= f.text_field :param1, placeholder: "type of user", class: "form-control" %>
</div>
<div class="form-group">
<p>I want ...</p>
<%= f.text_field :param2, placeholder: "desired functionality", class: "form-control" %>
</div>
<div class="form-group">
<p>so that...</p>
<%= f.text_field :param3, placeholder: "reason for desired functionality", class: "form-control" %>
</div>
<div class="actions">
<%= f.submit class: "btn btn-primary" %>
</div>
<% end %>
user_stories_controller.rb
class UserStoriesController < ApplicationController
before_action :set_project
before_action :set_user_story, except: [:create]
def index
@user_story = @project.user_stories.rank(:row_order).all
end
def update_row_order
@user_story.row_order_position = user_story_params[:row_order_position]
@user_story.save
render nothing:true # this is a POST action, updates sent via AJAX, no view rendered
end
def create
@user_story = @project.user_stories.create(user_story_params)
redirect_to @project
end
def new
end
def destroy
if @user_story.destroy
flash[:success] = "User story deleted"
else
flash[:error] = "User story could not be deletd"
end
redirect_to @project
end
def complete
user_story.update_attribute(completed_at, Time.now)
redirect_to @project, notice: "User story completed functionality complete"
end
def update
respond_to do |format|
if @project.user_stories.update(@project, user_story_params)
format.html { redirect_to project_path(@project), notice: 'User story was successfully updated.' }
format.json { render :show, status: :ok, location: @user_story }
else
format.html { render :edit }
format.json { render json: @user_story.errors, status: :unprocessable_entity }
end
end
end
def edit
@project = Project.find(params[:project_id])
@user_story = @project.user_stories(params[:id])
end
def show
end
private
def set_project
@project = Project.find(params[:project_id])
end
def set_user_story
@user_story = @project.user_stories(params[:id])
end
def user_story_params
params[:user_story].permit(:param1, :param2, :param3, :row_order_position)
end
end
【问题讨论】:
-
我怀疑你收到了错误,因为@user_story 不是 UserStory 的实例
标签: ruby-on-rails ruby activerecord erb ruby-on-rails-4.2