update_attributes使用非标准格式

时间:2011-03-19 23:07:45

标签: ruby-on-rails ruby-on-rails-3 models

由于我的代码和路线有些奇怪,我拼凑了一张表格。事情可以用于向数据库添加数据,但我似乎无法弄清楚如何更新数据。这是一些代码。

new.html.erb

<% form_tag '/list' do %>
    Episodes Completed: 
    <%= text_field_tag "completed"  %>
    Watch Status
    <%= collection_select(nil, 'id', @show_status, :id, :state) %>
    <%= hidden_field_tag('show_id', @show.id) %>
    <%= submit_tag 'Add' %>
<% end %>

edit.html.erb

<% form_tag("/list/#{@show_completion.show.id}", :method => :put ) do %>
    Episodes Completed: 
    <%= text_field_tag "completed", @show_completion.episodes_completed  %>
    Watch Status
    <%= collection_select(nil, 'id', @show_status, :id, :state) %>
    <%= hidden_field_tag('show_id', @show_completion.show.id) %>
    <%= submit_tag 'Edit' %>
<% end %>

这是控制器的创建和更新方法

def create
  @show_completetion = ShowCompletionStatus.new
  @show_completetion.user_id = current_user.id
  @show_completetion.episodes_completed = params[:completed]
  @show_completetion.status_state_id = params[:id]
  @show_completetion.show_id = params[:show_id]
  @show_completetion.save
end

def update
  @show_completion = ShowCompletionStatus.find(params[:id])

  @show_completion.episodes_completed = params[:completed]
  @show_completion.status_state_id = params[:id]
  @show_completion.show_id = params[:show_id]

  if @show_completion.update_attribute('episodes_completed', params[:completed])
    redirect_to "/list/#{current_user.username}"
  else
     redirect_to "/list/#{params[:id]}/edit"
  end
end

以下是我的路线:

match "list/" => "list#create", :via => :post
match "list/new/:show_id" => "list#new", :constraints => { :show_id => /[0-9]+/ }
match "list/:id/edit" => "list#edit", :constraints => { :id => /[0-9]+/ }, :via => :get
match "list/:id" => "list#update", :constraints => { :id => /[0-9]+/ }, :via => :put

我一直在尝试不同的事情,让它在4小时的大部分时间里都能正常工作。我想我只是缺少一些东西,但我看不到它。

有没有更好的方法来使表格更好地运作?

感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

尝试替换update_attribute来电save来电。

此外,如果您从头开始编写所有内容而不是使用内置函数,请尝试使用save!而不是save:如果失败则会引发异常,与普通{{1}不同只返回save

答案 1 :(得分:0)

我通过创建哈希并使用对象属性的键值对将其传递给更新属性来解决此问题。由于updates_attributes采用哈希而不是对象,因此在建立连接后它就是一个简单的解决方案。