使用 Rails 中的按钮更新记录?

win*_*ton 2 ruby-on-rails ruby-on-rails-3

我正在尝试使用按钮更新我的 Rails 应用程序中的记录。我有一个用户,我想更新它的 school_id 值。我有一个学校视图页面,用户可以在其中单击按钮将该学校的 ID 添加到用户 school_id 字段。我正在努力实施。这是我到目前为止所拥有的:

用户控制器:

def add_school
    @user = User.find(params[:user_id])
    @user.update_attributes(:school_id)

    respond_to do |format|
    flash[:notice] = "School has been added!"
    format.html { redirect_to :back }
    format.js
end
Run Code Online (Sandbox Code Playgroud)

学校显示页面上的按钮:

<%= button_to "Add School", add_school_user_path, :method => "put" %>
Run Code Online (Sandbox Code Playgroud)

我试图通过向用户控制器中的更新操作添加代码来以不同的方式执行此操作,但我也无法使其正常工作:

def update
  @user = User.find(params[:id])
  if @user.update_attributes(params[:school_id])
    flash[:notice] = "School has been added!"
    redirect_to @user
  end
  if @user.update_attributes(params[:user])
    flash[:notice] = "Successfully updated account and profile!"
  end
end
Run Code Online (Sandbox Code Playgroud)

将学校的 id 传递到用户 school_id 列的最佳方法是什么?

谢谢!!

编辑 1:路线

resources :users do
    member do
      get :following, :followers
      put :add_school
    end
Run Code Online (Sandbox Code Playgroud)

更新的控制器:

 def add_school
    @user = current_user
    @school = School.find(params[:id])
    @user.update_attributes(school_id: params[:school_id])

    respond_to do |format|
    flash[:notice] = "School has been added!"
    redirect_to @user.school
    end
  end
Run Code Online (Sandbox Code Playgroud)

更新按钮链接:

<%= button_to "Add School", add_school_user_path(@user, school_id: @school.id), :method => :put %>
Run Code Online (Sandbox Code Playgroud)

路由错误:

No route matches {:action=>"add_school", :controller=>"users", :school_id=>1, :id=>nil}
Run Code Online (Sandbox Code Playgroud)

ari*_*uod 5

你需要一个表格而不是一个按钮

<%= form_tag add_school_user_path(@user), method: put do -%>
  <%= hidden_field_tag :school_id, @school.id -%>
  <%= submit_tag 'Add school' -%>
<%- end -%>
Run Code Online (Sandbox Code Playgroud)

你没有提供上下文代码,也许 @user 和 @school 不是真正的变量名,但你可以从中得到想法


小智 5

提供的答案不再完全准确。只要您不尝试传递任意数据,您就可以使用 button_to 传递数据并更新记录。

Button_to 语法将是这样的 - 请注意,这是我的实现,它不会根据您的具体实现进行调整,因为您的控制器需要对您指定接受某些参数进行额外的调整 -:

<%= button_to "Mark Completed", todo_path(todo.id),   
    params: {:todo => { :id => todo.id, :completed => true, :user_id => current_user.id }}, 
    method: :put, data: { confirm: "Mark this To-Do as being completed?  This will hide it from view." } %>
Run Code Online (Sandbox Code Playgroud)