加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – Rails link_to从控制器动作更新属性

发布时间:2020-12-17 03:41:12 所属栏目:百科 来源:网络整理
导读:我希望能够有一个链接按下时根据控制器动作更新一个属性.我怎么能这样做?我是否必须创建单独的更新路由?我是新来的,所以请耐心等待. 调节器 def completed @meeting = Meeting.find(params[:id]) if @meeting.day_of_meeting == @meeting.days @meeting.up
我希望能够有一个链接按下时根据控制器动作更新一个属性.我怎么能这样做?我是否必须创建单独的更新路由?我是新来的,所以请耐心等待.

调节器

def completed
 @meeting = Meeting.find(params[:id])
 if @meeting.day_of_meeting == @meeting.days
  @meeting.update_attribute(:day_of_meeting,'1')
  redirect_to :back
 else
  @meeting.increment!
  redirect_to :back
 end
end

模型

def increment!
  update_attribute(:day_of_meeting,day_of_meeting + 1)
end

视图

<%= link_to meetings_completed_path(@meeting),remote: true do %>

路线

resources :meetings do
  get 'meetings/completed'
end

解决方法

您的代码有几个问题

>由于您要更新记录,因此需要在链接中包含方法:: patch,并且还需要修改routes文件以包含适当的路径.

在您的路线文件中添加

#routes.rb
resources :meetings do
  member do
    patch 'completed'
  end
end

在你看来

<%= link_to "Mark as completed",completed_meeting_path(@meeting),remote: true,method: :patch  %>

>因为你的链接中有一个remote:true所以rails会尝试渲染一个javascript模板,因为你没有渲染一个javascript模板,你会得到一个模板缺失错误

在你的控制器中

def completed
  @meeting = Meeting.find(params[:id])
  respond_to do |format|
    # if something ...
      # update meeting record and then render js template
      format.js {render :status => :ok} # it will render completed.js.erb inside 'app/views/meetings/' directory
    # else
      # something else
      format.js {render :action => "different_action"} # it will render different_action.js.erb inside 'app/views/meetings/' directory 
  end
end

现在您需要做的就是在js模板中编写一些基本的javascript来更新视图.

注意:如果您不想渲染任何内容,只需使用format.js {render:nothing =>真的}.此外,如果您想使用redirect_to调用而不是渲染js模板,只需删除您链接的remote:true表单.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读